mysql 常用sql语句优化原则

mysql 常用sql语句优化

优化索引

mysql 中用到索引的的场景

  • 匹配全值 (对索引中所有列都指定具体的值,即索引中的所有列都有等值匹配的条件)
  • 匹配值的范围查询 ( 对索引的值能进行范围查找 比如 > 和 < ,但是在聚合索引下,会使后面的索引失效,比如a_b_c 为聚合索引,b使用了范围查询,会使c的索引失效)
  • 匹配最左前缀,仅仅使用索引中的最左边的列进行查找
  • 仅仅对索引进行查询,当查询的列都在索引的字段中时,查询效率更高。
  • 匹配列前缀,仅仅使用索引中的第一列,并且只包含索引第一列的开头一部分进行查找。比如 like ‘abc%’
  • 能够实现索引匹配部分精确而其他部分进行范围匹配
  • 如果列名是索引,使用 column is null会使用索引
  • mysql 5.6 引入了 index condition pushdown 的特性,进一步优化了查询。pushdown 表示操作下放,某些情况下的条件过滤操作下放到存储引擎
  • *

索引的使用原则
* 符合左前缀原则
* 索引上不要使用函数和进行运算,另外类型也要对应 比如 where name = abc 虽然sql不会报错,但是会导致索引失效
* 使用 or 时,如果存在没有在索引上的列,也会导致索引失效
* 如果 mysql 分析使用索引必没有使用索引查询效率更优,将不会使用索引
*

优化insert 语句

  • 批量插入时尽量使用 insert into valuse(),(),() 这种形式

优化orderby 语句

  • 尽量在索引列上使用排序,排序同样符合索引的最佳左前缀原则
  • 排序时,尽量使用一种顺序排序,否则会导致索引失效
  • 无法使用索引排序时,尽量使用单路排序,不要使用双路排序

优化group by 语句

  • 默认情况下,group by 语句执行时需要先进行排序,优化参照 order by 语句。如果查询包括 group by 但用户想要避免排序结果的消耗,可以指定 order by null 禁止排序。

优化嵌套查询

  • 对于一些子查询,如果可以用表连接来解决并且效率更高,建议用表连接(尤其表连接的字段上有索引)

优化 or 语句

  • 对含有or 的查询语句,如果要利用索引,则 or 之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引

优化分页查询

  • 在索引上完成排序分页的操作,最后根据主键关联回原表查询锁需要的其它内容。例如
    select a.film_id,a.name from film a inner join (select film_id from film order by title limit 50,5) b on a.film_id = b.film_id

使用sql 提示

  • use index 在查询语句中表明的后面,添加 use index 来提供希望mysql去参考的索引列表,就可以让mysql不在考虑其它可用的索引。比如 select count(*) from table user index(idx_table_col)
  • ignore index 如果想要忽略一个或多个索引,则可以使用ignore index 作为hint.
  • forece index 强制mysql使用一个特定的索引。

你可能感兴趣的:(mysql)