您的位置:首页 > 数据库 > MySQL

mysql 常用sql语句优化原则

2017-08-18 14:55 671 查看

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 优化 sql 索引