整理中
- 写完SQL先explain查看执行计划(SQL性能优化)
日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。
- SQL语句中IN包含的值不应过多
in值会导致数据库资源消耗过多,尽可能的使用 = 当遇到连续的数据时间,比如1.2.3.4.5可以使用between
- SELECT语句尽量使用指定字段查询
select语句中尽量使用select xx from xx; 不要使用select * from xx; select * 会扫描全表资源,非常的浪费资源,即使查询全表,指定字段依然会减少很多消耗
3.当只需要一条数据的时候,使用limit 1
这是为了使EXPLAIN中type列达到const类型
4.排序尽量使用索引
如果该排序未使用索引进行排序,应当尽量减少排序,不然会降低效率。
5.如果or两边的字段中,有一个不是索引字段,尽量减少使用
此结果会造成该查询不走索引的情况,平时可以使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。 尽量用union all代替union,union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。
6.尽量不使用ORDER BY RAND()
mysql里用到ORDER BY RAND()在数据量比较多的时候是很慢的,因为会导致mysql全表扫描,故也不会用到索引,所以ORDER BY RAND()用来随机时已经是到禁区里了,所以我们应该尽量避免使用ORDER BY RAND()才对,所以这个是需要用其他方法替代或者优化才行。
7.区分in和exists
in -- 适合子表比主表数据小的情况 ,先执行子查询在执行主体 exists --适合子表比主表数据大的情况, 先执行主体在执行子查询 例如sql: select * from 表A where id in (select id from 表B) select * from 表A where exists(select * from 表B where 表B.id=表A.id) 当表A的数据大于表B的数据时,使用in,当表A的数据小于表B的数据时,使用exists
8.分页,分段方式
直接使用limit进行分页在数据量过大的时候会导致效率降低,可以通过设置分页起点的方式,可以使分页效率加大
同时在查询巨大数据量的数据是,可以通过between分段查询,使得查询效率增加
9.不要在where子句中对字段进行null值判断,以及运算
进行null值判断会导致全表扫描,很影响效率
而使用运算,比如where age*2=8会导致放弃使用索引,可以写成where age=4或者where age=8/2
10.不使用%前缀模糊查询
会导致全表扫描,不建议使用
11.关于JOIN
LEFT JOIN 返回左表以及右表符合条件的信息
INNER JOIN 返回左右表符合条件的信息
RIGHT JOIN 返回右表以及左表符合条件的信息
尽量使用inner join,参与联合查询的表至少为2张表,一般都存在大小之分。如果连接方式是inner join,在没有其他过滤条件的情况下My
当涉及SELECT语句的优化时,以下是更多与查询性能相关的建议:
-
避免使用SELECT DISTINCT 使用SELECT DISTINCT会导致额外的排序操作,增加了查询的开销。如果可以使用GROUP BY来达到相同的去重效果,优先考虑使用GROUP BY。
-
避免在WHERE子句中使用NOT条件 在WHERE子句中使用NOT条件会导致索引失效,性能下降。尽量使用其他方式重写查询,避免使用NOT条件。
-
使用复合索引 如果查询中经常用到多个列作为查询条件,可以创建复合索引来覆盖这些列。复合索引可以提高查询性能。
-
使用覆盖索引(Covering Index) 覆盖索引是指索引包含了查询中涉及到的所有列,而不需要再去回表查询数据。这可以减少IO操作,提高查询性能。
-
使用JOIN时指定JOIN类型 在使用JOIN操作时,明确指定JOIN类型(INNER JOIN、LEFT JOIN、RIGHT JOIN等),避免使用默认的JOIN类型,以免意外产生错误结果或性能问题。
-
使用合适大小的连接缓冲区 对于复杂的JOIN操作,可以调整连接缓冲区的大小(join_buffer_size)来优化查询性能。
-
使用ENUM而不是VARCHAR存储枚举值 如果某个字段的值只有有限的几个选项,使用ENUM数据类型而不是VARCHAR来存储,可以节省存储空间并提高查询速度。
-
使用分区表 对于大型表,可以考虑使用分区表来将数据分散存储,提高查询性能。
-
避免使用HAVING子句 在GROUP BY查询中,尽量使用WHERE子句代替HAVING子句,因为HAVING子句会在结果集生成后再进行过滤。
-
尽量使用连接符号代替CONCAT函数 在拼接字符串时,使用连接符号(例如 ||、+等)比使用CONCAT函数更高效。
-
使用索引覆盖最左前缀 如果创建了复合索引,查询时尽量按照索引的最左前缀顺序来使用,以确保索引可以有效覆盖查询条件。