- 索引的概念:就是用一个数据结构组织某一列的数据,当你要根据这一列查询数据的时候,不需要进行全表扫描,只需要按照这个数据结构找到那一列的值,再找到那一行的物理地址即可;
- 索引的实现和数据结构:底层就是一个b+树
需要理解b-树的概念
不同的存储引擎对索引的实现是不一样的(myism/innodb) - 存储引擎
a)myism:在myism存储引擎的索引中,每个叶子节点的data存储的是数据行的物理地址,比如0x07之类的东西;
myism最大的特点是数据文件和索引文件是分开的,先在索引文件中搜索得到物理地址,再在数据文件中得到行数据
b)innodb:数据文件就是索引文件,每个叶子节点的data就是数据的所在行,要求必须有索引,会根据主键创建一个默认的索引,叫做聚簇索引;
联合索引:针对几个字段建立的联合索引(create index (shop_id,product_id,gmt_create)) - 索引的使用规则
a)全列匹配:查询SQL的where条件中包括了联合索引中的所有字段;
b)最左前缀匹配:SQL里面用到了联合索引最左边的一个或者几个,也是可以用上索引的;
c)最左前缀匹配了,但是中间某个值没匹配:联合索引中最左边的条件会走索引查找,其他的只会进行简单的数据过滤,不会走索引;
d)没有最左前缀匹配:一定不行,没有走索引,索引mysql中一定要遵循最左侧前缀匹配原则;
e)前缀匹配:不是使用=,>=,<=而是使用的模糊匹配,必须最左侧是精准的值(like XX%)才可以使用索引查找;
f)范围列匹配:如果你是范围查询,比如>=,<=,between操作,你只能是符合最左前缀的规则才可以范围,范围之后的列就不用索引了
select * from product where shop_id>=1 and product_id=1
这里就在联合索引中根据shop_id来查询了
h)包含函数:如果你对某个列用了函数,比如substring之类的东西,那么那一列不用索引,函数会导致索引失效的 - 索引的注意事项
过多的索引会占用磁盘文件的,高并发情况下频繁的修改索引会导致性能损耗的
建议:索引不宜创建过多并且要针对唯一的值创建索引 - 索引的类型
主键索引(聚簇索引),联合索引,前缀索引