查询执行缓慢的最大共因是缺少索引,explain
命令以查看SQL的执行计划,进而有的放矢。
这里分享三个优化技巧
第一、添加索引
根据执行计划添加必要的索引,充分利用索引,可以解决大部分的SQL查询缓慢。
第二、条件查询减少类型转换,匹配正确的数据类型
MySQL中一个长期存在的问题是连接中的类型不匹配。如果您有一个a JOIN b ON a.col1 = b.col1
的查询,两个表中的col1
具有不兼容(不同且不可强制)的类型,则不能使用索引来解析查询,即使它存在。也就是说,如果col1
是a
中的varchar
,但在b
中是int
,则连接将很慢。
这个问题也经常在WHERE
子句中引发,例如WHERE a.col1 = "value"
,其中a.col1
是整数,"value"
由于引号而写成字符串文字。同样,索引,即使存在,也不会被使用。
第三、糟糕的分页
以SELECT id FROM Whatever LIMIT 10360000,10000
分页查询为例,其中用户要查询10000条数据记录。
这不是一个有效的做法,因为数据库必须一遍又一遍地执行相同的查询。它可能能够对低限制值(在分页开始时)应用一些温和的优化,但最终它将不得不查询整个表的大部分。最重要的是,MySQL在内部使用链表表示结果集,因此具有大偏移值的LIMIT
子句效率非常低。
我们可以在按表自然顺序读取时再拉取一行数据。这将获得LIMIT
子句中的偏移部分。它不必物理排序,因为表是按自然主键顺序读取的。它只会访问表的10000条记录片段。
select id from Whatever order by id limit 10001
我们输出10000条记录,并以最后的记录id值作为新的起点lastid
:
select id from Whatever where id >= :lastid order by id limit 10001