2020-11-06 索引

34 阅读4分钟

什么是索引?作用是什么?
索引提供只想存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序,数据库使用索引以找到特定值,然后根据指针找到包含该值的行,这样可以使对应于表的sql语句执行的更快,可快速访问数据表中的特定信息。

说白了,建立索引的列,在查询的时候,可以加快查询速度。

那么既然如此,那就把所有的列都加上索引呗,这就加快了查询速度,事实是这样的吗?
回答是 否定的,并非如此,索引的建立的确可以加快查询速度,但是有两点负面影响:1,索引的建立,会附加给数据库一些文件,大量的索引会无形增加很多文件,占用很多空间。2,数据库并非是查询,还有增删改,而索引的建立会导致执行增删改的时候需要对索引有相应的维护,那么会导致dml操作速度变慢,尤其是增删改大于查询操作的表,更不应该建立特别多的索引。

索引的类型:
1.普通索引
2.唯一索引
3.主键索引
4.组合索引
5.全文索引

  1. 没有特殊的附加属性,仅仅可以增加查询速度
    添加方式:
    (1)直接创建索引
    CREATE INDEX index_name ON table(column(length))
    (2)修改表结构的方式添加索引
    ALTER TABLE table_name ADD INDEX index_name ON (column(length))

image.png

  1. 所谓唯一,即加了索引的列的值唯一,允许有空值出现
    1)创建唯一索引
    CREATE UNIQUE INDEX indexName ON table(column(length))
    (2)修改表结构
    ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

image.png

  1. 这个很好理解,每张表一般都有一个主键,这个索引首先相当于唯一索引,即唯一,其次不允许有空值出现
    (1)创建主键索引
    CREATE TABLE table (id int(11) NOT NULL AUTO_INCREMENT ,title char(255) NOT NULL ,
    PRIMARY KEY (id)
    );

  2. 组合的是列,即他可以实现对多个列的组合索引,加快查询速度,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用,比如 有三列 分别为 a b c ,那么当创建一个(a,b,c)组合索引的时候,那么他会默认创建三个索引,即 a ab abc,三个索引(最左前缀原则,一定包含a)
    (1)创建组合索引
    ALTER TABLE table ADD INDEX zuhesuoyin (a,b,c);
    (2)

image.png

  1. 全文的一个索引,例如:一个列的类型为txt,那么存入的可能是一个作文,一篇文章,这种可以增加查询其中内容的速度。
    (1)创建表的适合添加全文索引

CREATE TABLE table (

id int(11) NOT NULL AUTO_INCREMENT ,

title char(255) CHARACTER NOT NULL ,

content text CHARACTER NULL

PRIMARY KEY (id),

FULLTEXT (content)

);

(2)修改表结构添加全文索引

ALTER TABLE article ADD FULLTEXT index_content(content)

(3)直接创建索引

CREATE FULLTEXT INDEX index_content ON article(content)

image.png

索引的注意事项:
1.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
这将导致索引失效而进行全表扫描,例如
SELECT * FROM table_name WHERE YEAR(column_name)<2017;
6.不使用not in和<>操作

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。