Q:MySQL的索引有哪些
1.主键索引
- 唯一标识表中的一行数据,不允许 NULL 值。
- 一个表只能有一个主键。
- InnoDB 存储引擎中,主键索引直接存储整行数据(聚簇索引)。
CREATE TABLE users ( id INT PRIMARY KEY, -- 声明主键 name VARCHAR(50));
2.唯一索引
- 保证索引列的值唯一,但允许 NULL 值(多个 NULL 不冲突)。
- 可创建多个唯一索引。
CREATE UNIQUE INDEX idx_email ON users(email);
3.组合索引
- 索引会按照定义的列顺序依次使用,若查询条件未包含最左侧的列,则索引失效
Q:回表查询
回表查询:回标查询就是查询时先通过索引查到对应的主键值,然后通过主键值来查询整条数据。但不是说所有的非聚簇索引查询都会使用回表查询。只有我需要查询的字段不止查询的条件字段及主键时才会触发回表查询
意思是如果我通过Name这个字段进行查找,如下第一行sql所示,如果我的表只需要id,Name的话是不会进行回表查询的
select id,Name from biao where Name = 'zhangsan' //只查询了id(主键),Name字段 select * from biao where Name = 'zhangsan' //查询了除id,Name字段
在第三行,查询所有字段,此时就会触发回表查询
- 优点:利用索引快速定位数据,避免全表扫描。
- 缺点:
- 多次随机 I/O:若查询结果集较大,回表操作会导致大量随机磁盘访问(每次回表可能跨页)。
Q:什么是左前缀原则
左前缀原则就是说在执行查询时,条件字段的顺序必须与复合索引创建时列的字段的顺序一致,这就是遵循了左前缀原则,就可以利用复合索引,如果在使用复合索引时,不遵从左前缀原则,这个复合索引就会失效
扩展:为什么需要左前缀原则?
因为B+Tree的存储结构决定了查询方式,以(a,b,c)复合索引来举个例的话就是
1.先按a排序
2.当a相同时,按b排序
3.当a和b都相同时,按c排序
如果在2,3中的查询条件中不包含a的话,数据库无法快速定位到数据的起始位置,可能会导致全索引扫描或者全表扫描