
慢 SQL 的优化,主要从两个方面考虑,SQL 语句本身的优化,以及数据库设计的优化。
SQL 查询的时候,应该只查询需要的列,而不是包含额外的列,像select *这种写法应该尽量避免。
在数据量比较大,分页比较深的情况下,需要考虑分页的优化。
sql 体验AI代码助手 代码解读复制代码 select * from tabel where type = 2 and level = 9 order by id asc limit 100000,10;where条件提取出主键,在将该表与原数据表关联,通过主键 id 提取数据行,而不是通过原来的二级索引提取数据行
css 体验AI代码助手 代码解读复制代码 select a.* from table a, (select id from table where type = 2 and level = 9 order by id asc limit 100000,10) b where a.id = b.id;
limit 第一个参数对应的主键值,根据这个主键值再去过滤并 limit
sql 体验AI代码助手 代码解读复制代码 select * from table where id > (select id from table where type = 2 and level = 9 order by id asc limit 190 );
合理的设计和使用索引,是优化慢 SQL 的利器。
or 查询,可以使用 union 或者子查询来替代,因为早期的 MySQL 版本使用 or 查询可能会导致索引失效,高版本引入了索引合并,解决了这个问题,不过建议大家在实际使用中还是规范写法,能不用就少用。
or,可以使用索引,避免全表扫描
bash 体验AI代码助手 代码解读复制代码 id <> 'aaa' ===> id > 'aaa' or id < 'aaa'
@xxx.com,那么类似这种后面几位为固定值的字段就非常适合定义为前缀索引
sql 体验AI代码助手 代码解读复制代码 alter table test add index dix_emaile_prefix (email(6));
需要注意的是,前缀索引也存在缺点,MySQL 无法利用前缀索引做 order by和group by操作,也无法作为覆盖索引。
join 语句来替代子查询,因为子查询是嵌套查询,而嵌套查询会新建创建一张临时表,而临时表的创建与销毁会占用一定的系统资源以及花费一定的时间,同时对于返回结果集比较大的子查询,其对查询性能的影响更大。
join 超过三张表,第一 join 太多降低查询的速度,第二 join 的 buffer 会占用更多的内存。
order by子句的顺序完全一致,并且所有列的排序方向都一样时,才能够使用索引来对结果做排序。
union 查询中都会失效,因为它无法利用索引。
所以需要将where、limit等子句下推到 union 的各个子查询中,以便优化器可以充分利用这些条件进行优化。
此外,除非确实需要服务器去推,一定要试用union all,如果不加all关键字,MySQL 会给临时表加上 distinct选项,这会导致对整个临时表做唯一性检查,代价很高。本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。