索引是存储引擎用于快速找到记录的一种数据结构。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级,"最优"的索引有时比一个"好的"索引性能要好两个数量级。

索引可以包含一个(单列索引)或多个列(组合索引)的值。

想要使用组合索引首先要了解一个原则:最左前缀原则。如果索引包含多个列,那么列的顺序十分重要,因为 MySQL 只能高效地使用索引的最左前缀列。

最左前缀原则:

比如我们创建一个(A,B,C)组合索引,也就相当与创建了(A),(A,B),(A,B,C)三个索引。

这里需要注意的一点是,在满足最左前缀的原则下,索引字段的使用和顺序无关。

如:select * from test where B = '1' and A = '2';

上述语句也使用了索引,使用了(A,B)索引。

但是:select * from test where C = '1' and B = '2';

上述语句不能使用索引,不满足最左前缀原则。如果后面再加上 and A = '3' 则可以使用索引。

使用索引时需要注意的地方:

  • 首先要满足最左前缀原则 ,如果不是按照索引的最左列开始查找,则无法使用索引。

  • 不能跳过索引中的列。例如:where A = '1' and C = '3';在这当中,只有 A 能使用索引,C 不能使用索引。

  • MySQL 能在索引中做最左前缀匹配的 like 比较,但是如果是通配符开头的 like 比较,就不能使用索引。例如:like 'name%' 可以使用索引,like '%name' 则不能使用索引。

  • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。例如:where A = 'name' and B like 'name%' and C = 'name'; 这里只有 A,B 能使用索引,C不能使用索引。

  • where 条件中包含表达式或函数的参数不能使用索引。例如 where A + 1 = 2; 使用了表达式,不能使用索引。

  • "把 where 条件里面的列都建上索引"。这类说法是错误的。

  • 将选择性最高的列放在索引最前列。

  • order by 子句和查找型查询的限制是一样的,需要满足索引的最左前缀的要求。

EXPLAIN 命令:

EXPLAIN 语句输出结果的各个行的解释如下:

id:select 识别符,这是 select 查询序列号。

select_type: 表示查询中 select 类型,简单或复杂。

table:显示这一行的数据是关于哪张表的。

type:连接类型,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,得保证查询至少达到 range 级别,最好能达到 ref。如果值为 index,则说明 MySQL 使用了索引扫描来做排序。

possible_keys :指出 MySQL 能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。

key: 显示 MySQL 在查询中实际使用的索引,若没有使用索引,显示为 NULL。

key_len :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。

ref :表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

rows :表示 MySQL 根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。

Extra :包含不适合在其他列中显示但十分重要的额外信息。如 using where(这表示 MySQL 服务器将存储引擎返回行以后再应用 where 过滤条件);using index(使用了覆盖索引)。

MySQL索引的使用及注意事项的更多相关文章

  1. 【转】mysql索引使用技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  2. mysql索引使用技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  3. MySQL 索引建立原则及注意事项

    一.索引建立的几大原则: 1) 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 ...

  4. MySQL索引类型总结和使用技巧以及注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...

  5. MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项

    以下的文章主要介绍的是MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项是值得我们大家注意的,我们大家可能不知道过多的对索引进行使用将会造成滥用.因此MySQL索引也会有它的缺点: 虽然索引 ...

  6. mysql索引分类及注意事项

    MYSQL索引主要分为四类:主键索引,普通索引(聚合,非聚合),唯一索引,全文索引 全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用. 索引的原理:利用二叉树(哈希表 ...

  7. 使用mysql索引技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  8. mysql索引使用注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  9. 来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项

    索引的基础概念索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码:存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行 ...

随机推荐

  1. canvas的Chart图表插件

    今天写页面页面需求到柱状图标,今天介绍一下我所用的Chart.js图表插件 官网:http://www.bootcss.com/p/chart.js/         里面会有下载js文件和中文文档 ...

  2. odps编写UDF的实现

    问题 尝试写一个UDF,参数支持输入x,y与一个Polygon,返回结果是(x,y)是否在输入的Geometry之内? 环境 eclipse odps 插件 jts包:jts-1.8.jar 解法 i ...

  3. idea打jar包

    昨天碰到个问题:使用idea打成jar包,但是在测试环境一直报错.参考: http://blog.csdn.net/aotian16/article/details/52198378 之后发现原来的j ...

  4. 'weblogic.kernel.Default (self-tuning) 问题weblogic层面解决办法

    声明:出现这个问题有程序方面.网络方面.weblogic设置方面等等原因,此文章主要讲述由于weblogic设置而导致的解决办法. 因为: 1.程序问题,需要项目自己去解决,weblogic在做优化处 ...

  5. web统计数据搜集及分析原理

    在现代web应用开发中,数据扮演着越来越重要的角色:通过数据我们能够知道系统哪些地方有待改进,从而迭代开发重新上线, 随后再次通过数据我们来评估新的迭代开发是否满足了我们的预期目标,从而形成了一个数据 ...

  6. SQL Server ->>监控和管理Tempdb

    Tempdb作为一个公共数据库,存储着一些临时的数据.有些是用户自己创建的,有些是SQL Server自己创建的.Tempdb空间被使用的一些常见场景有 用户自定义:临时表和表变量.游标. SQL S ...

  7. laravel5.5 自定义验证规则——手机验证RULE

    相信很多小伙伴和我一样烦恼,laravel没有自带手机号的验证,每次验证手机号都要写正则这类的规则,每次都是repeat yourself!违背了编码的一个原则,就是Don't repeat your ...

  8. GoAccess分析Nginx日志详解

    一.为了提高 GoAccess 分析准确度,建议配置 nginx.conf 的 log_format 项如下: log_format main '$remote_addr - $remote_user ...

  9. 如何在 MSBuild Target(Exec)中报告编译错误和编译警告

    编译错误和编译警告 MSBuild 的 Exec 自带有错误和警告的标准格式,按照此格式输出,将被识别为编译错误和编译警告. 而格式只是简简单单的 error: 开头或者 warning: 开头.冒号 ...

  10. July 17th 2017 Week 29th Monday

    A heart is a heavy burden. 心,可是很重的. Follow your heart, but always take your brain with you. Easy to ...