什么是索引?

索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。

所有的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操作性能的最好方法。

一个表最多可有16个索引。最大索引长度是256个字节,尽管这可以在编译MySQL时被改变。

对于CHAR和VARCHAR列,你可以索引列的前缀。这更快并且比索引整个列需要较少的磁盘空间。

多列索引

MySQL能在多个列上创建索引。一个索引可以由最多15个列组成。(在CHAR和VARCHAR列上,你也可以使用列的前缀作为一个索引的部分)。

一个多重列索引可以认为是包含通过合并(concatenate)索引列值创建的值的一个排序数组。

当你为在一个WHERE子句索引的第一列指定已知的数量时,MySQL以这种方式使用多重列索引使得查询非常快速,即使你不为其他列指定值。

请记住以下几点准则:

1、WHERE只能使用一个索引,MySQL会寻找它认为最优的那个索引,你可以通过强制索引指令来令MySQL使用指定索引“FORCE

INDEX(索引名称)”;

2、最左原则,比如我们建立了以下三个索引:

status_action_catalog # status, action, catalog

status_action # status, action

status # status

那么MySQL将会用status_action_catalog,而不会用其它2个,即使你的查询条件只有status。

3、多列索引的这些列是AND的关系,不是OR,比如以下这个查询将无法命中索引:

SELECT * FROM `tb_war` WHERE status=1 AND action=1 OR

catalog=3

EXPLAIN

分析查询语句的利器,下面说一下各个列的含义:

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

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE

INDEX(indexname)来强制使用一个索引或者用IGNORE

INDEX(indexname)来强制MySQL忽略索引

key_len 使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref 显示索引的哪一列被使用了,如果可能的话,是一个常数

rows MySQL认为必须检查的用来返回请求数据的行数

Extra 关于MySQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using

temporary和Using filesort,意思MySQL根本不能使用索引,结果是检索会很慢

extra 列返回的描述的意义

Distinct 一旦MySQL找到了与行相联合匹配的行,就不再搜索了

Not exists MySQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了

Range checked for each

Record(index

map:#)没有找到理想的索引,因此对于从前面表中来的每一个行组合,MySQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort

看到这个的时候,查询就需要优化了。MySQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

Using index

列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

Using temporary

看到这个的时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER

BY上,而不是GROUP BY上

Where used

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

不同连接类型的解释(按照效率高低的顺序排序)

system 表只有一行:system表。这是const连接类型的特殊情况

const

表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MySQL先读这个值然后把它当做常数来对待

eq_ref

在连接中,MySQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref

这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

range 这个连接类型使用索引返回一个范围中的行,比如使用>或

index 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)

ALL 这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

mysql多列索引_MySQL的多列索引相关推荐

  1. mysql 创建列的索引_mysql创建多列索引及优化

    原文连接地址:http://leeyin.iteye.com/blog/441350 什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查 ...

  2. mysql教程联合索引_MySQL中的联合索引学习教程

    联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...

  3. mysql 建索引_mysql数据库正确建立索引及使用

    普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...

  4. MySQL支持的四种索引_Mysql常见四种索引的使用

    提到mysql优化,索引优化是必不可少的.其中一种优化方式 --索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升. 我们知道项目性能的瓶颈主要是在"查(select)&q ...

  5. mysql优化varchar索引_MySQL优化--概述以及索引优化分析

    一.MySQL概述 1.1.MySQL文件含义 通过如下命令查看 show variables like '%dir%'; MySQL文件位置及含义 名称 值 备注 basedir /usr/ 安装路 ...

  6. mysql的学习要点_MySQL中的联合索引的学习要点总结

    MySQL中的联合索引的学习要点总结 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a ...

  7. mysql如何给text字段添加索引_MySQL 是如何利用索引的

    阅读本文大概需要 4 分钟. 一.前言 在 MySQL 中进行 SQL 优化的时候,经常会在一些情况下,对 MySQL 能否利用索引有一些迷惑.例如: MySQL 在遇到范围查询条件的时候就停止匹配了 ...

  8. mysql锁机制和索引_MySql锁机制及索引 · 十年饮冰,难凉热血

    一:ACID 原子性:对数据库的修改,要么都执行,要么都不执行 一致性:事务开始和结束时,都必须保持一致状态,事务结束时,索引等也必须完全正确 隔离性:事务处理过程中的中间状态对外部都是不可见的,反之 ...

  9. elsearch mysql实时索引_MySQL和Lucene(Elasticsearch)索引对比分析

    MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr.ElasticSearch)的核心类库.两者的索引(index)有什么区别呢?以前写过 ...

最新文章

  1. mybatis的一些基础问题
  2. type和object
  3. QA:Visual C# 2008 compiler could not be created.
  4. 关于Sa系列用户不能登录,只能本地windows身份验证的说明
  5. AJAX中get与post区别
  6. ASP 文件下载实例
  7. java刷票小程序,小程序投票系统刷票
  8. 三星note10 android q,【极光ROM】-【三星NOTE10/NOTE10+/5G N97XX-9825】-【V6.0 Android-Q-TG1】...
  9. 大数字加法(C语言实现)
  10. android 联系人 拼音,Android 2.1 (Eclair)的中文联系人拼音检索问题
  11. python谷歌小恐龙,这还是你断网时的样子嘛~
  12. Beginning Auto Layout Tutorial in iOS 7: Part 1
  13. HTML界的“苏炳添”——详解Canvas优越性能和实际应用
  14. iOS开发 App内自动连接指定Wi-Fi
  15. 除了霸王洗发水,还能怎么拯救程序员的发际线?
  16. 2014世界杯预测与开源大数据
  17. [转帖]江湖经验:喝酒的学问技巧,社会新人一定要看~!
  18. 模电笔记1:半导体基础知识
  19. Unity(三)三维数学和坐标系统
  20. 蓝桥杯 模板Template Part10:AT24C02存储器

热门文章

  1. charCodeAt()方法
  2. 一个请求到响应的详细过程
  3. 拉线式电子尺|直线传感器|拉线电子尺,拉绳电子尺
  4. Http协议面试题小结
  5. 爱客IKCRMCOM销售离职带走客户怎么办?爱客帮你防患于未然
  6. 人类幽门螺旋杆菌感染率高
  7. 可怕的思维定势!!!
  8. 手把手教你理解决策树:从概念到应用
  9. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~8地图编辑器-处理流程
  10. BLM的市场细分案例剖析