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