Mysql常用索引及优化
索引是帮助我们快速获取数据的数据结构。索引是在存储引擎中实现的,因此不同存储引擎的索引也不同。这里只介绍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常用索引及优化的更多相关文章
- php面试专题---MySQL常用SQL语句优化
php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...
- MySQL常用SQL语句优化
推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...
- MySQL函数索引及优化
很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下.针对此种情况本文从MySQL5.7 及MySQL8.0中分别进行不同方式的优化. 1. M ...
- mysql的索引以及优化
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- mysql:联合索引及优化
命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 尽量不要用or,如果可以用union代 ...
- 理解Mysql的索引与优化
转自:http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库 ...
- MySQL的索引与优化
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...
- MySQL的索引及其优化
前言 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整 ...
- mysql常用索引
1.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引的作用相当 ...
随机推荐
- python对象以及pickle腌制
#python对象 1.什么是python的对象 2.详解pickle腌制 1.什么是python的对象 Python的内置的对象类型主要有数字.字符串.列表.元组.字典.集合等等.其实,在pytho ...
- IT项目为什么失败 --美国IT项目管理硕士笔记(一)
IT项目为什么失败 什么是项目 项目可以被看作任何一系列的活动和任务.这些活动和任务有一个特定目标需要在特定要求下完成,并有一个明确的开始结束日期和资金限制(如果有).项目需要消耗人力或非人力资源 ...
- vuex理解之modules小记
好记性不如烂笔头 demo预览 源代码 前情提要 关于vuex,其实很久以前就研究使用过,还研究过 flux,redux之类的体系,当时感觉对于 state,action,dispatch,views ...
- Farseer.net轻量级开源框架 中级篇:自定义配置文件
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...
- 【sqli-labs】 less65 GET -Challenge -Blind -130 queries allowed -Variation4 (GET型 挑战 盲注 只允许130次查询 变化4)
双引号括号闭合 http://192.168.136.128/sqli-labs-master/Less-65/?id=1")%23
- 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...
- CAD从二制流数据中加载图形(com接口Delphi语言)
主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...
- attack on titans(动态规划递推,限制条件,至少转至多方法,进击的巨人)
题目意思: 给n个士兵排队,每个士兵三种G.R.P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数. 原题 Attack on Titans Time Limit: 2 Seconds ...
- 利用CMD 創建新文件的機種方法
用 CMD 創建新文件 説明一下: 是在Windows的 CMD命令行模式下,或者在PowerShell命令行模式下創建新文件的機種方法. 創建空文件 cd.>a.txt cd.表示改变当前目录 ...
- Ubuntu终端常用的快捷键(转载)
本文转自:https://www.cnblogs.com/nucdy/p/5251659.html 侵删 Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应 ...