SQL优化方面的经验

简介: 在项目中优化SQL查询执行效率,主要从表设计、索引创建与使用三个维度考虑。表设计包括合理选择数据类型、主键设计等;索引创建关注大表、常用查询条件字段,区分度高的列优先建索引;使用时避免索引失效,利用explain检查执行计划。高级优化可采用读写分离和分库分表策略。

必答内容:
嗯,这个话题就比较大了。 那我们在项目中,优化SQL的查询执行效率,会从多个维度来考虑的。
第一个呢,就是表的设计。
比如数据类型的选择,数值类型到底选择 tinyint、int还是bigint,要根据实际需要选择。字符串类型,到底选择char还是varchar,也需要根据具体业务确定。(char定长字符串,效率高;varchar变长字符串,效率略低)
还需要考虑主键的设计,主键在设计时,尽量考虑递增顺序插入的主键,比如:自增主键 或 雪花算法生成的主键。(这样可以规避页分裂、页合并现象的产生)
第二个呢,就是索引的创建。
针对于数据量较大,且查询比较繁琐的表创建索引。(单表超过10w记录)
针对于经常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
尽量选择为区分度高的列建立索引,如果该字段是唯一的,建立唯一索引,效率更高。(区分度越高,效率越高)。
在varchar类型的字段上,建议指定索引长度(建立前缀索引),没必要对全字段建立索引,根据实际文本区分度决定索引长度就可以。
尽量建立联合索引,而且在联合索引中将区分度高的字段放在前面,减少单列索引。(查询时,联合索引很多时候可以索引覆盖,避免回表,提高效率)
在满足业务需求的前提下,建立适当的索引,索引不宜过多。(索引过多,会增加维护索引的成本,影响增删改的效率)
第三个呢,就是索引的使用。
编写DQL时,在满足业务需要的情况下,要尽量避免索引失效的情况。 【索引失效的情况,见 3.2】
尽量使用索引覆盖,避免回表查询,提高性能。
那这些情况呢,都可以通过 explain 关键字来查看SQL语句的执行计划。
进阶回答:
那如果从数据库层面来讲,也可以基于读写分离的模式,来降低单台服务库的访问压力,从而提高效率。
当然,如果数据量过大,也可以考虑对目前项目中的数据库进行分库分表处理。

目录
相关文章
|
12月前
|
负载均衡 算法 应用服务中间件
Nginx的负载均衡
Nginx 是一款高性能的Web服务器与反向代理服务器,支持负载均衡功能,能有效提升系统性能与可靠性。其负载均衡策略包括基于轮询和权重的分配方法,以及IP哈希、最小连接数等算法,可根据实际需求灵活选择。
375 5
|
12月前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
12月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
281 1
|
12月前
|
存储 安全
Cookie会话跟踪的原理
会话跟踪技术包括Cookie和Session。Cookie是客户端技术,首次访问时服务器通过Set-Cookie响应头发送Cookie,浏览器保存并在后续请求中通过Cookie请求头回传,实现会话跟踪。但Cookie易被用户修改或禁用,安全性较低。Session则是服务器端技术,每次会话生成唯一的Session ID,通过Cookie传递给客户端,客户端在后续请求中携带此ID,服务器据此识别会话。Session更安全,但在集群环境中需解决会话共享问题。
317 1
|
12月前
|
存储 关系型数据库 MySQL
为什么MySQL索引结构是B+tree ?
在MySQL中,为了提高检索效率和稳定性,采用了B+树作为索引的数据结构。相比二叉树或B树,B+树的非叶子节点仅存储key和指针,使得每页能容纳更多key,树的层级更浅,检索更快;所有数据集中在叶子节点,形成双向链表,利于区间查询。以16KB页为例,三层B+树可容纳约2190万条数据。
332 1
|
12月前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
210 1
|
10月前
|
机器学习/深度学习 缓存 人工智能
《DeepSeek在高并发下的性能秘籍:稳定性与速度保障》
DeepSeek是一款基于Transformer架构的大语言模型,专为高并发场景设计。通过自注意力机制、分布式系统和负载均衡技术,DeepSeek能高效处理多请求,确保稳定性和快速响应。其缓存机制加速数据获取,模型优化提升计算效率,动态资源调配灵活应对流量波动。这些技术共同作用,使DeepSeek在智能客服、内容推荐等场景中表现出色,成为高并发应用的理想选择。
974 10
单模和多模光纤电缆的区别 原文出自[易百教程] 转载请保留原文链接: https://www.yiibai.com/geek/330968
光纤电缆是基于光可以通过全内反射被限制在弯曲的玻璃棒内这一理念。
158 25
单模和多模光纤电缆的区别 原文出自[易百教程] 转载请保留原文链接: https://www.yiibai.com/geek/330968
|
12月前
|
供应链 安全 量子技术
OASA走进三未信安、奇安信和360,共建龙蜥安全生态
开展操作系统安全技术创新交流合作,提供更便捷的商业合作渠道,服务好联盟成员间共同的客户、用户。
OASA走进三未信安、奇安信和360,共建龙蜥安全生态
|
12月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
330 3