当前位置: 首页 > 科技观察

DBA大牛MySQL优化经验,语句执行提速就是这么简单!

时间:2023-03-13 00:26:35 科技观察

打开一个技术论坛,看到最多的文章主题就是MySQL性能优化,为什么要优化?因为:数据库有瓶颈,系统吞吐量慢。随着应用程序的运行,数据库的数据会越来越多,处理时间也会越来越长。数据读写速度慢就是我们所说的“性能问题”。程序员遇到它总是纠结!今天总结了一些MySQL优化方面的经验。每个人都可以在您以后的工作中为您提供帮助!像前导符优化这样的模糊查询形式比如'%AAA%'和'%AAA'是不会用到索引的,但是在业务中不可避免的要用到这种形式。常见的方法有两种:优化方案一:使用覆盖索引,即只使用索引就可以得到查询的列,不需要查询表记录,也去掉了索引;优化方案二:使用locate函数或者position函数代替like查询:比如table.fieldlike'%AAA%'可以改成locate('AAA',table.field)>0orPOSITION('AAA'INtable.field)>0in和exist如果要查询的两个表的大小相当,那么用in和exists区别不大。如果两个表一个是小表,另一个是大表,则子查询大表使用exists,子查询小表使用in:例如:A表(小表),B表(大表)例子1:示例二:notin不存在如果查询语句使用notin,则对整个表进行表内外扫描,不使用索引;而notexist的子查询仍然可以使用表上的索引。所以不管哪个表大,用notexists比notin快!子查询优化MySQL5.6之前的版本对子查询进行了处理:查询的结果集不会被计算用于与其他表的join,每次都会扫描外表的一条数据,重新执行子查询。MySQL5.6对子查询的处理:将子查询的结果集缓存到一个临时表中。临时表索引主要用于去除重复记录,也可能用于后面的join查询。这种技术在5.6Subquery中叫做materialization,materializedsubquery,可以看到select_type字段是subquery,在5.5中是DEPENDENTSUBQUERY。一般子查询可以改成表的关联查询。子查询会创建和销毁临时表,效率低下。straight_joinmysql提示:Mysql优化器在处理多表关联时,很可能会选择错误的驱动表进行关联,导致关联数增加,导致SQL语句执行速度非常慢。这时候需要有经验的DBA来判断和选择正确的驱动表。这个时候straightjoin就起作用了。下面看一下使用straight_join进行优化的情况:尽量使用user表作为驱动表,使用straight_join强制连接顺序:高效分页传统分页:select*fromtablelimit10000,10限制原则:限制10000,10offset越大越慢推荐分页:复杂关联SQL的优化首先查询返回的结果集,通常查询返回的结果集很小,有优化空间。通过查看优化器选择的执行计划和驱动表,执行计划的行可以大致反映问题。找出每个表之间的关系,检查关联字段是否有合适的索引。使用straight_join关键字强制调整驱动表的选择,测试优化思路。条件允许的情况下拆分复杂的SQL。保持尽可能简单。forceindex有时由于统计信息不准确等原因,优化器可能没有选择最佳的执行计划,可以人为的改变mysql的执行计划。比如count的优化是按效率排序的,count(字段)总结了MySQL最好的性能优化主要是了解innodb的索引原理和结构以及SQL的执行计划,熟能生巧不断积累经验的基础。