数据库查询优化-添加索引

索引优化

对于开发人员,说起数据查询优化,最简单也是最常用的一个方案就是创建索引。可以说索引是所有开发人员接触的第一个查询优化的方案。

在数据库中,我们通过创建索引可以大大提高查询的速度,一个好的索引可以另SQL的查询更加效率。而一个错误的索引不仅带不来效率的提高,甚至会带来额外的系统开销

索引的基本操作

创建索引

建表时创建索引

建表的时候指定

CREATE TABLE user(
       ID INT NOT NULL, 
       username VARCHAR(16) NOT NULL, 
       INDEX [indexName] (username(length))
 );

CREATE创建索引

为已有的表添加

CREATE INDEX indexName ON user(username(length));

主键索引

该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL

ALTER TABLE user ADD PRIMARY KEY (ID)

唯一索引

这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)

ALTER TABLE user ADD UNIQUE indexName (username)

普通索引

添加普通索引,索引值可出现多次

ALTER TABLE user ADD INDEX indexName (username)

全文索引

该语句指定了索引为 FULLTEXT ,用于全文索引。仅可用于 MyISAM 表,
用于在一篇文章中,检索文本信息的。

ALTER TABLE user ADD FULLTEXT indexName (username)

联合索引

组合索引(包含多列的索引,与单行索引相对),遵循最左原则

ALTER TABLE user ADD INDEX indexName ( `column1`, `column2`, `column3` )

删除索引

DROP INDEX indexName ON user;

修改索引

alter TABLE user add INDEX indexName on(username(length))

查询索引信息

使用 show index 命令来列出表中的相关的索引信息。可以通过添加 \g 来格式化输出信息。

SHOW INDEX FROM user

使用索引

使用索引时候需要注意的

  1. LIKE关键字匹配’%‘开头的字符串,不会使用索引,但是以’%'结尾的可以。
  2. OR关键字的两个字段必须都是用了索引,该查询才会使用索引。
  3. 使用多列索引必须满足最左匹配.

数据库索引的原理

一般来说数据库索引是使用B+tree的数据结构

使用B+树,并不是二叉树而是指的平衡树,它可以根据键值快速找到数据。B+树索引通过键值可以快速定位数据行所在的页,然后数据库通过页内容读入内存,而在内存中定位到数据。

数据库索引可以实现效果

  1. 可以避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页。
  2. 对于非聚集索引,有时不需要访问数据页即可得到数据。
  3. 聚集索引可以避免数据插入操作,集中于表的最后一个数据页面。
  4. 在某些情况下,索引可以避免排序操作。

无索引的查询中,没有使用索引的情况下扫描每个记录来查找符合条件的记录。

数据库索引的不足

  1. 数据库索引使用了空间换时间的策略,建立的索引会占用磁盘空间。随着数据的增加,索引文件会膨胀很快。
  2. 数据库不仅需要保存数据还需要保存索引文件,这就导致对表进行更新或者删除操作的时候速度降低。
  3. 索引越多会让数据更新操作的时候变得更慢,不合理的索引会拖慢数据库的整体效率。

创建索引的原则

  1. 主键列默认使用了索引
  2. 假如有外键定义也需要建立索引
  3. 经常被作为查询条件的列最好建立索引
  4. 经常需要被排序、分组的字段建立索引,如果是复合索引,则需要排序、分组的顺序和索引顺序一致
  5. 极少作为查询条件、或者数据存在大量重复的列不需要建立索引
  6. 对于数据较多的字段,最好不要建立索引
  7. 经常被修改的字段,最好不要建立索引
  8. 多表连接查询的时候,连接字段上应该建立索引
  9. 频繁被修改的表,最好不要建立太多的索引
  10. 检查索引,删除无用的索引
  11. 正确算是创建复合索引
    1. 对于复合索引,第一个字段应该是使用频率最高的字段
    2. 复合索引中的几个字段,需要经常以AND方式出现在条件语句中,否则不需要创建复合索引
    3. 复合索引中的字段不宜过多(3个及以下)
    4. 一个字段有单独查询也有关联查询,一般来说创建单独索引而不需要创建复合索引

添加索引带来的优化

这里我就贴一个网友的文章,虽然是很多年前的文章,但是里面内容依旧有用:https://blog.csdn.net/gprime/article/details/1687930

你可能感兴趣的:(数据,#,查询优化,数据库,数据库优化)