MysqL 索引详细解读
1.索引概念
MysqL 索引的工作原理,类似一本书的目录,如果要在一本书中找到特定的知识点,先通过目录找到对应的页码。在 MysqL 中,存储引擎用类似的方法使用索引,先在索引找到对应值,再根据索引记录找到对应的数据行。简单总结,索引就是为了提高数据查询的效率,跟一本书的目录一样。
以下查询假设字段 c2
上建有索引,则存储引擎将通过索引找到 c2
等于 测试01
的行。也就是说,存储引擎先在索引按值进行查找,再返回所有包含该值的数据行。
MysqL> select * from t1 where ='测试01'\G
*************************** . row ***************************
:
: 测试
row in set ( sec)
从执行计划的角度,也可以看出索引 idx_c2
被使用:
MysqL> create table t1(
-> int not null auto_increment,
-> varchar() default null,
-> primary key()
-> ) engine = innodb;
Query OK, rows affected ( sec)
MysqL> insert into t1() values(,'测试01');
Query OK, row affected ( sec)
MysqL> create index idx_c2 on t1();
Query OK, rows affected ( sec)
Records: Duplicates: Warnings:
MysqL> explain select * from t1 where ='测试01'\G
*************************** . row ***************************
id:
select_type: SIMPLE
table: t1
partitions: NULL
type: ref
possible_keys: idx_c2
key: idx_c2
key_len:
ref: const
rows:
filtered:
Extra: Using index
row in set, warning ( sec)
常见的索引类型主要有 B-Tree 索引、哈希索引、空间数据索引(R-Tree)、全文索引,在后续小节将详细介绍。
2. 索引优点
索引最大的作用是快速查找数据,除此之外,索引还有其他的附加作用。
B-Tree 是最常见的索引,按照顺序存储数据,它可以用来做 order by
和 group by
操作。因为 B-Tree 是有序的,将相关的值都存储在一起。因为索引存储了实际的列值,某些查询仅通过索引就可以完成查询,如覆盖查询。
总的来说,索引三个优点如下:
但是,索引是最好的解决方案吗?任何事物都是有两面性的,索引同样如此。索引并不总是最好的优化工具
- 对于非常小的表,大多数情况,全表扫描会更高效;
- 对于中大型表,索引就非常有效;
- 对于特大型表,建索引和用索引的代价是日益增长,这时候可能需要和其他技术结合起来,如分区表。
总的来说,只有当使用索引利大于弊时,索引才是最好的优化工具。