1.如果查询速度慢,开启MySQL慢查询,找到具体的查询速度慢的sql语句,使用Explan查看SQL执行计划,
优化sql语句使explan返回结果的type类型达到ref或range级别。
1.type类型结果说明:
1.system:表仅有一行,基本用不到
2.const:表最多一行数据配合,主键查询时触发较多
3.eq_ref:对于每个来自前面的表的行组合,从该表中读取一行。这可能时最好的联接类型,除了const类型;
4.ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取;
5.range:只检索给定范围的行,使用一个索引来选择行。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range;
6.index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小;
7.all:全表扫描;
8.性能排名:system > const > eq_ref > ref > range > index > all。
9.实际sql优化中,最后达到ref或range级别。
2.Extra常用关键字
1.Using index:只从索引树中获取信息,而不需要回表查询;
2.Using where:WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。需要回表查询。
3.Using temporary:mysql常建一个临时表来容纳结果,典型情况如查询包含可以按不同情况列出列的
GROUP BY和ORDER BY子句时;
优化方法有
1.使用具体的字段,不要使用* 减少回表查询,节省资源和减少网络开销
2.使用unionAll 或者分来两条查询语句用多线程查询来代替“or”,因为or会导致索引失效,从而全表扫描,
3.使用数值代替字符串类型,因为引擎在处理查询和连接时会比较字符串中的每一个字符,而对于数字类型只需要比较一次就够了,字符串会降低查询和连接的性能,会增加存储开销。
4.使用varchar代替char,varchar变长字段按数据实际长度存储,存储空间小,可能节省存储空间,char按声明大小存储,不足补空格,对于查询来说,在相对较小的字段内搜索,效率更高。
5.使用默认值代替null,使用!=,<>,is null,is not null查询的成本高,优化器自动放弃索引。如果把null值换成默认值,很多时候能让走索引成为可能,同时表达意思也相对清晰一点。
6.使用!=和<>很有可能会让索引失效,应尽量避免在where子句中使用!=或者<>操作符,否则引擎放弃使用索引从而进行全表扫描。
7.三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小。因为inner join是等值连接,返回的行数比较小,所以性能相对会好一点,使用了左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较小,这是mysql的优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优。
8.提高group by的效率,先过滤再分组,把不需要的记录过滤掉。
9.操作delete或者update语句,加个limit或者分批次删除,可以降低写错sql的代价,sql
10.使用批量插入提升性能,默认新增mysql都有事务控制,导致每条都需要事务开启和事务提交,而批量操作是一次事务开启和提交,效率提升明显,达到一定的的量级,效果显著。
11.表连接不要过多,索引不要太多,关联的表越多,编译的时间和开销也就越大,可以根据关系把表拆成几个小表执行,可读性高,效率也高;不要太多的索引,索引虽然提高了查询效率但是插入效率却降低了。
12.避免在索引上使用内置函数,内置函数会让索引失效。
13.排序时应按照组合索引中各列的顺序进行排序,即使索引中只有一个列是要排序的,否则排序性能会比较差。
14.使用联合索引要遵循最左前缀原则,否责会导致索引失效,
15.尽量避免使用like模糊查询,如果必须使用,应尽量使用右模糊查询,左模糊查询无法使用索引,全模糊查询是无法优化的。
mysql可搭配redis使用,将不经常改变的数据存放到redis中,查询时从redis获取,避免经常查询重复的数据给数据库造成压力;
代码层面涉及到很多条数据时要使用批量操作,这样可以避免不必要的资源消耗和事务开销;
如果查询语句很多的话可以尝试将不是很关联的表查询语句分开查询,使用多线程进行查询,可以提高查询的响应速度。
如果涉及到到一次性多次查询同一张表的话,并且数量不是很大,可以将表数据全部查询出来,在代码处进行数据的组装,避免多次查询给数据库造成压力,可搭配redis使用。