定义 |
定义:在mysql中也叫做“键(Key)”,是存储引擎用于快速找到记录的一种数据结构。
理解:索引就像是书的目录,然后找到对应章节的页码。在mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。
例子:
select id from t_sign where staff_id=’123’
如果在staff_id列上建有索引,则mysql将使用该索引找到staff_id为123的行,返回数据行
索引的类型 |
在mysql中,索引是在存储引擎层而不是服务器层实现的。所以没有统一的索引标准。Mysql支持的索引类型有一下几种
主要说一下B-Tree索引 |
建立一个People的表
CREATE TABLE People(
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date ,
gender enum('m','f') not null,
key(last_name,first_name,dob)
)
-- 全值搜索
select *from people where last_name='Allen' and first_name='Cuba' and dob='2018-03-07'
-- 匹配最左前缀
select *from people where last_name='Allen'
-- 匹配列前缀
select *from people where last_name like "A%"
-- 匹配范围(要求是查询姓在Allen和Barrymore之间的人)
select *from people where last_name BETWEEN "Allen" and "Barraymore"
-- 精确匹配某一列并范围匹配另外一列
select * from people where last_name='Allen' and first_name like "K%"
对于B-Tree索引的限制
1.如果不是按照索引最左列开始查找,无法使用,例如直接插到first_name=xxx的是无法使用索引的
2.不能跳过索引中的列。查询条件不能为last_name=xxx and birthday=xxx,不能跳过中间first_name,这样只能按照第一列索引查找
3.如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找
例如:where last_name=’Allen’ and first_name like ‘J%’ and birthday =‘2018-02-15’
这个查询有效的索引只要前两列
总结 |
这篇博客算是看《高性能Mysql》的一个读书笔记,其中的代码也有自己的实践,光看书有时候留不下什么印象,只有自己动手去做,才明白其中讲的到底是怎么一回事