索引,是帮助MySQL高效获取数据的数据结构。排好序的快速查找数据结构。
平时所说的索引,没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。
其中聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引默认都是使用B+树,统称为索引。除了B+树这种类型的索引之外,还有哈希索引等。
索引语法
- 主键索引:
PRIMARY KEY - 唯一索引:
UNIQUE - 普通索引:
INDEX - 全文索引:
FULLTEXT-- table_name 表明,column_name 字段名-- 添加索引create INDEX idx_name on table_name(`column_name`);ALTER TABLE `table_name` ADD INDEX idx_column_name (`column_name`);-- 联合索引create INDEX idx_name on table_name(`column1`, `column2`, `column3`);ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`);-- 查看索引SHOW INDEX FROM table_name-- 删除索引drop index idx_name on table_name;
强制走某个索引
-- 在表名后面添加 force index(索引名) 即强制走对应的索引 select * from asset_stock_deliver force index(asset_stock_deliver_index_4) where warehouse_name='上海-物料仓';MySQL 索引结构
MySQL 索引结构
- BTree 索引
- Hash索引
- full-text 全文索引
-
索引下推
-- bill_name 字段创建了普通索引 explain select bill_name from asset_base_bill where bill_name like '%单%';哪些情况下需要创建索引
主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中和其他表关联的字段,外键关系建立索引
- 频繁更新的字段不适合创建索引——因为每次更新不单单更新记录还会更新索引
- where条件立用不到的字段不创建索引
- 单键/组合索引的选择问题
- 查询中排序字段,排序字段若通过索引访问大大提高排序速度
-
哪些情况下不需要创建索引
表记录太少
- 经常增删改的表的字段
- 数据重复且分布平均的表字段
聚集索引
聚集索引是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点成为数据页。
聚集索引的存储并不是物理上连续的,而是逻辑连续的。页通过双向链表链接,页按照主键顺序排序;每个页中的记录也是通过双向链表进行维护的。
非聚集索引
非聚集索引,叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了一个书签(bookmark),该书签用来告诉 Innodb 存储引擎哪里可以找到与索引相对应的行数据。由于 Innodb 存储引擎表是索引组织表,因此 Innodb 存储引擎的非聚集索引的书签就是相对应的行数据的聚集索引键。
