1、为什么要使用索引
1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
2. 可以大大加速数据的检索速度(大大减少的检索的数据量),创建索引的最主要的原因
3. 帮助服务器避免排序和临时表
4. 将随机IO变为顺序IO
5. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义
2、索引这么多优点,为什么对表中的每一列创建一个索引呢?
1. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度
2. 缩影要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果建立聚簇索引,那么需要的空间就会更大
3. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
3、索引是如何提高查询速度的?
将无序的数据变成相对有序的数据(就像查目录一样)
用于快速定位我们想要找的数据的位置
4、使用索引的注意事项
1. 在经常需要搜索的列上,可以加快索引的速度
2. 在经常使用在where字句中的列上面创建索引,加快条件的判断速度
3. 在经常需要排列的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询的时间
4. 对于中到大型表索引都是非常有效的,但是特大型表的话维护开销会很大,不适合建索引
5. 经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
6. 避免where子句中对字段施加函数,这样会造成无法命中索引
7. 在使用InnoDB时使用与业务无关的自增主键作为主键,即使用逻辑主键,而不要使用业务主键
8. 将打算加索引的列设置为NotNull,否则将导致引擎放弃使用索引而进行全表扫描
9. 删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗Mysql5.7可以通过查询sys库的chema_unused_indexes视图来查询哪些索引从未被使用
10. 在使用limit offset查询缓慢时,可以借助索引来提高性能
5、索引主要使用的两张数据结构
1. 哈希索引
底层数据结构是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引
2. BTree索引
使用B树种的B+Tree。但对于主要的两张存储引擎(MyISAM和InnoDB)的实现方式是不同的
6、 什么是覆盖索引?使用实例
覆盖索引:
如果一个索引包含(或者覆盖)所有需要查询的字段的值,就称“覆盖索引”
在InnoDB存储引擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是通过主键在查找一次。这样就会比较慢,覆盖索引就是把查询出的列和索引是对应的,不做回表操作
引用实例:
创建索引(name,age),查询:select name,age from user where name =‘张三’ and age =22 ,要查询出列在叶子节点都存在,所以就不用回表
7、 like是否使用索引
mysql在使用like查询的时候只有使用后面的%时(name like '李三%'),才会使用到索引。
优化:
SELECT LOCATE('q', 'asqdfasdfser')==>返回 3
POSITION(substr IN str)
INSTR(str,substr)
8、 索引的类型
1. 主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2. 唯一索引
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3. 普通索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4. 全文索引
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5. 多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
9、单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
1. 限定数据的范围: 禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。
2. 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
3. 垂直分区:根据数据库里面数据表的相关性进行拆分。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表
4. 水平分区: 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达
到了分布式的目的。 水平拆分可以支撑非常大的数据量。