索引是帮助我们快速获取数据的数据结构。索引是在存储引擎中实现的,因此不同存储引擎的索引也不同。这里只介绍InnoDB存储索引所支持的BTree索引:

一、索引类型

  为了方便举例子,先创建表person:

    

  1、创建普通索引

    

  2、创建唯一索引

    

  3、主键

    主键是特殊的唯一索引,必须指定为PRIMARY KEY,常使用AUTO_INCREMENT自增主键。

  4、联合索引

    多列联合建立的索引

    

    该联合索引相当于一下三个索引:

      name;

      name, age;

      name, age, telnumber;

    而age和age,telnumber上没有索引,因为BTree索引遵循最左前缀原则。

二、索引优化

1、选择索引

  可以考虑在where字句中出现的列或join字句出现的列上创建索引

          

2、最左前缀原则

  对于联合索引(name, age, telnumber),B+树是按照从左到右的顺序建立搜索树的;如('zhangsan', '18', '15237502296'),先匹配name字段来确定搜索方向,name匹配成功再匹配age字段、telnumber字段,最终检索到目标数据。

  该联合索引是三级索引,从左到右依次去匹配,一个字段匹配成功才能去匹配下个字段,拿('18','15237502296')来检索时,因为没有拿到一级索引,无法确定下一步索引方向。('zhangsan',  '15237502296')来索引时情况一样,name匹配成功后,没有age这个二级索引,只能在name相同的情况下,去遍历所有的telnumber。

  B+树的数据结构决定了,使用的时候必须遵循最左前缀原则,尽量将经常参与查询的字段放在联合索引的最左边。

3.like的使用

  一般情况不建议使用like,若非使用不可的话,注意like '%aa%'不能使用索引,like 'aaa%'可以使用索引。这也是最左前缀原则的一个使用场景。

4、不能使用索引的说明

  MySQL按照联合索引从左到右匹配,直到遇见范围查询,如>,<,between,like等就停止匹配,a = 1 and b = 2 and c > 3 and d = 4,如果建立联合索引(a, b, c, d),d是不会使用索引的,若索引顺序是(a, b, d,c),a,b,c,d都会使用索引,只是c最终是一个范围值。

5、order by

  order by有两种排序方式:(1)using filesort使用算法在内存中进行排序(慢);(2)使用索引进行排序(快)

  (1)

   如果age是单列索引,order by使用索引;

  (2)  

  若telnumber是单列索引,age不是索引或是单列索引,order by不能使用索引,因为MySQL每次查询的时候只能从众多索引中选择一个,而这次选择了telnumber。建立联合索引(telnumber, age),order by就能使用索引,注意遵循最左查询原则不要建立(age, telnumber)联合索引。

  最后需要注意,MySQL对排序的记录大小有限制,当记录大于max_length_for_sort_data(1024)时,order by不能使用索引,只能使用using filesort。

    更多order by请参考链接:http://blog.csdn.net/zht666/article/details/18010539

    

  

  

Mysql常用索引及优化的更多相关文章

  1. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

  2. MySQL常用SQL语句优化

    推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...

  3. MySQL函数索引及优化

    很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下.针对此种情况本文从MySQL5.7 及MySQL8.0中分别进行不同方式的优化. 1. M ...

  4. mysql的索引以及优化

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  5. mysql:联合索引及优化

    命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 尽量不要用or,如果可以用union代 ...

  6. 理解Mysql的索引与优化

    转自:http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库 ...

  7. MySQL的索引与优化

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  8. MySQL的索引及其优化

    前言 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整 ...

  9. mysql常用索引

    1.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引的作用相当 ...

随机推荐

  1. QS之shell script

    1 Invoke Mdoelsim In order to open Modelsim automatically, it is better to use a shell script to inv ...

  2. CAD得到所有实体2

    主要用到函数说明: IMxDrawSelectionSet::Select2 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARI ...

  3. 04Oracle Database 登陆

    Oracle Database 登陆 EM Express Login https://localhost:5500/em/login cmd sqlplus SQL/PLUS system/code ...

  4. layer iframe层弹出图片

    这个js是在一个layer iframe弹出层中,点击按钮弹出图片

  5. win10 javac无效

    win10配置环境变量时,要写绝对路径,不再需要写JAVA_HOME和classpaht,直接在pass上添加全路径就可以了.

  6. HDU - 6266 - HDU 6266 Hakase and Nano (博弈论)

    题意: 有两个人从N个石子堆中拿石子,其中一个人可以拿两次,第二个人只能拿一次.最后拿完的人胜利. 思路: 类型 Hakase先 Hakase后 1 W L 1 1 W W 1 1 1 (3n) L ...

  7. Django中的模板变量

    示例文件: template_variable_demo.zip

  8. Turtle-可视化界面画圣诞树

    圣诞节(Christmas)又称耶诞节.耶稣诞辰,译名为“基督弥撒”,是西方传统节日,起源于基督教,在每年公历12月25日.弥撒是教会的一种礼拜仪式.圣诞节是一个宗教节,因为把它当作耶稣的诞辰来庆祝, ...

  9. Educational Codeforces Round 41 D. Pair Of Lines(961D)

    [题意概述] 给出平面上的10W个点,要求判断这些点能否被两条直线穿过,即一个点至少在一条直线上. [题解] 思路很快可以想到.取3个不共线的点,它们形成一个三角形:如果有解,其中的一条直线一定与三角 ...

  10. springcloud(十一):熔断聚合监控Hystrix Turbine

    springcloud(十一):熔断聚合监控Hystrix Turbine