浅谈MySQL优化技巧

今天来学习一下MySQL优化技巧。面试

一、Explain

善用 explain 查看SQL执行计划sql

image

  • type列,链接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别
  • key列,使用到的索引名。若是没有选择索引,值是NULL。能够采起强制索引方式
  • key_len列,索引长度
  • rows列,扫描行数。该值是个预估值
  • extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary

二、SELECT语句务必指明字段名称

  • SELECT * 增长不少没必要要的消耗(cpu、io、内存、网络带宽)
  • 使用SELECT * 没法使用覆盖索引

三、SQL语句中IN包含的值不该过多

MySQL对于IN作了相应的优化,即将IN中的常量所有存储在一个数组里面,并且这个数组是排好序的。可是若是数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用链接来替换。数据库

四、当只须要一条数据的时候,使用limit 1

  • 当你只想要返回一条数据时,加上 LIMIT 1 能够增长性能。这样同样,MySQL数据库引擎会在找到一条数据后中止搜索,而不是继续日后查少下一条符合记录的数据。
  • 这是为了使EXPLAIN中type列达到const类型

五、避免在 where 子句中对字段进行 null 值判断

对于null的判断会致使引擎放弃使用索引而进行全表扫描。数组

六、不建议使用%前缀模糊查询

例如LIKE “%name”或者LIKE “%name%”,这种查询会致使索引失效而进行全表扫描。可是可使用LIKE “name%”。网络

七、避免在where子句中对字段进行表达式操做

好比
select user_id,user_project from table_name where age*2=36;性能

中对字段就好了算术运算,这会形成引擎放弃使用索引,建议改为学习

select user_id,user_project from table_name where age=36/2;优化

八、对于联合索引来讲,要遵照最左前缀法则

举列来讲索引含有字段id,name,school,能够直接用id字段,也能够id,name这样的顺序,可是name,school都没法使用这个索引。因此在建立联合索引的时候必定要注意索引字段顺序,经常使用的查询字段放在最前面。spa

九、注意范围查询语句

对于联合索引来讲,若是存在范围查询,好比between,>,<等条件时,会形成后面的索引字段失效。code

十、使用合理的分页方式以提升分页的效率

select id,name from table_name limit 866613, 20

使用上述sql语句作分页的时候,可能有人会发现,随着表数据量的增长,直接使用limit分页查询会愈来愈慢。

优化的方法以下:能够取前一页的最大行数的id,而后根据这个最大的id来限制下一页的起点。好比此列中,上一页最大的id是866612。sql能够采用以下的写法。

select id,name from table_name where id> 866612 limit 20

十一、必要时可使用force index来强制查询走某个索引

有的时候MySQL优化器采起它认为合适的索引来检索sql语句,可是可能它所采用的索引并非咱们想要的。这时就能够采用force index来强制优化器使用咱们制定的索引。

参考

面试官:给我谈谈你平时是如何优化sql的

相关文章
相关标签/搜索