共计 1518 个字符,预计需要花费 4 分钟才能阅读完成。
这篇文章主要介绍“MySQL 优化语句执行的方法有哪些”,在日常操作中,相信很多人在 MySQL 优化语句执行的方法有哪些问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL 优化语句执行的方法有哪些”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
like 前导符优化
like 模糊查询形如 %AAA% 和 %AAA 将不会使用索引,但是业务上不可避免可能又需要使用到这种形式。
通常的方法有两种:
优化方案一:使用覆盖索引,即查询出的列只是用索引就可以获取,而无须查询表记录,这样也走了索引;
优化方案二:使用 locate 函数或者 position 函数代替 like 查询:如 table.field like %AAA% 可以改为 locate(AAA , table.field) 0 或 POSITION(AAA IN table.field) 0
in 和 exist
如果查询的两个表大小相当,那么用 in 和 exists 差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用 exists,子查询表小的用 in: 例如:表 A(小表),表 B(大表)
示例一:
示例二:
not in 和 not exist
如果查询语句使用了 not in 那么内外表都进行全表扫描,没有用到索引; 而 not exist 的子查询依然能用到表上的索引。所以无论哪个表大,用 not exists 都比 not in 要快!
子查询优化
MySQL 5.6 之前的版本对子查询处理:不会将查询的结果集计算出来用作与其他表做 join,outer 表每扫描一条数据,子查询都会被重新执行一遍。
MySQL 5.6 对子查询的处理:将子查询的结果集 cache 到临时表里,临时表索引主要用来移除重复记录,并且随后也可能用于做 join 查询,这种技术在 5.6 中叫做物化的子查询,物化子查询可以看到 select_type 字段为 subquery,而在 5.5 里为 DEPENDENT SUBQUERY。
子查询一般都可以改成表的关联查询,子查询会有临时表的创建、销毁,效率低下。
straight_join
mysql hint:
Mysql 优化器在处理多表的关联的时候,很有可能会选择错误的驱动表进行关联,导致了关联次数的增加,从而使得 sql 语句执行变得非常的缓慢。
这个时候需要有经验的 DBA 进行判断,选择正确的驱动表,这个时候 straightjoin 就起了作用了,下面我们来看一看使用 straight_join 进行优化的案例:
尝试采用 user 表做驱动表,使用 straight_join 强制连接顺序:
高效分页
传统分页:
select * from table limit 10000,10
limit 原理:
Limit 10000,10
偏移量越大则越慢
推荐分页:
复杂关联 SQL 的优化
首先查询返回的结果集,通常查询返回的结果集很少,是有优化的空间的。
通过查看执行计划,查看优化器选择的驱动表,从执行计划的 rows 可以大致反应出问题的所在。
搞清各表的关联关系,查看关联字段是否有合适的索引。
使用 straight_join 关键词来强制调整驱动表的选择,对优化的想法进行验证。
如果条件允许,对复杂的 SQL 进行拆分。尽可能越简单越好。
force index
有时优化器可能由于统计信息不准确等原因,没有选择 *** 的执行计划,可以人为改变 mysql 的执行计划,例如:
count 的优化
按照效率排序的话,count(字段)
到此,关于“MySQL 优化语句执行的方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!