索引是帮助我们快速获取数据的数据结构。索引是在存储引擎中实现的,因此不同存储引擎的索引也不同。这里只介绍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. phpcms v9文章内容页调用上一篇下一篇的方法(转)

    phpcms v9文章内容页调用上一篇下一篇的方法如下,魔客吧(www.moke8.com)提示您直接摘取如下代码中的红色部分即可: 上一篇:{$previous_page[url]}" t ...

  2. Windows下80端口被进程System&PID=4占用的解决方法

    我的占用原因是 SQL Server Reporting Services,停止掉这个服务并设置其为手动启动即可 如果你并没有安装 SQL Server,请参考下文解决 =============== ...

  3. Queries for Number of Palindromes(求任意子列的回文数)

    H. Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabyt ...

  4. R语言学习 - 热图美化

    实际应用中,异常值的出现会毁掉一张热图.这通常不是我们想要的.为了更好的可视化效果,需要对数据做些预处理,主要有对数转换,Z-score转换,抹去异常值,非线性颜色等方式. 对数转换 为了方便描述,假 ...

  5. bzoj3940 censoring 题解(AC自动机)

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  6. Extjs查询实现

    效果图如上: 页面代码: Ext.QuickTips.init(); //放在图标上会自动提示信息 Ext.define('ExtApp.view.StudentList' , { extend : ...

  7. 使用JavaScript制作一个好看的轮播图

    目录 使用JavaScript制作出好看的轮播图效果 准备材料 1.图片若干张(包括轮播图和按钮的图片) 2.将按钮的图片应用到按钮上的CSS样式文件 3.实现轮播和点击跳转的JavaScript代码 ...

  8. centos 7桌面和命令行转行

    CentOS7图形界面与命令行界面(终端)切换(1)CentOS7 在图形界面进入dos界面 :ctrl+alt+F6 dos界面进入图形界面:ctrl+alt+F2 本机用的这个命令: (2)Cen ...

  9. shell日志颜色处理

    记录一下shell日志颜色处理 _COLORS=${BS_COLORS:-$(tput colors >/dev/)} __detect_color_support() { # shellche ...

  10. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...