什么是索引?
索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据
索引的优缺点?
- 优点
- 提高数据检索的效率,降低数据库IO成本。
- 通过索引对数据进行排序,降低数据的排序成本,降低CPU的消耗。
- 缺点
- 建立索引需要占用物理空间
- 会降低表的增删改的效率,因为每次对表记录进行增删改,需要进行动态维护索引,导致增删改时间变长
什么情况下需要建索引?
- 主键自动创建唯一索引
- 较频繁的作为查询条件的字段
- 查询中排序的字段,查询中统计或者分组的字段
什么情况下不需要建索引?
- 表记录太少的字段
- 经常增删改的字段
- 唯一性太差的字段,不适合单独创建索引。比如性别,民族,政治面貌
索引有哪几种分类?
MySQL主要的几种索引类型:1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引。
- 普通索引: 是最基本的索引,它没有任何限制
- 唯一索引: 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
- 主键索引: 是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
- 联合索引: 一个索引包含多个列,实际开发中推荐使用组合索引。
- 全文索引: 全文搜索的索引。FULLTEXT 用于搜索很长一篇文章的时候,效果最好。只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建。
- 聚簇索引: 将数据存储与索引放到了一块,找到索引也就找到了数据
- 非聚簇索引: 将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因
- 覆盖索引: 覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
索引的数据结构有哪些?
Hash索引和B+树索引的区别?
为什么B+树比B树更适合实现数据库索引?
聚集索引相对于非聚集索引的区别?
什么是回表查询?
什么是覆盖索引?
什么是最左匹配原则?
索引失效场景有哪些?
- 组合索引未使用最左前缀,例如组合索引(age,name),where name=’张三’不会使用索引;
- or会使索引失效。如果查询字段相同,也可以使用索引。例如where age=20 or age=30(索引生效),where age=20 or name=‘张三’(这里就算你age和name都单独建索引,还是一样失效);
- 如果列类型是字符串,不使用引号。例如where name=张三(索引失效),改成where name=‘张三’(索引有效);
- like未使用最左前缀,where A like ‘%China’;
- 在索引列上做任何操作计算、函数,会导致索引失效而转向全表扫描;
- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引;