mysql索引

227 阅读3分钟

一、索引类型

1.普通索引。

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

(1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。

(2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))

(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length));

2.唯一索引。

它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

(1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))

(2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))

(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));

3.主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。

4.全文索引

5.联合索引(复合索引、多列索引)

存储及查询

二、索引操作

查看索引

show index from 数据库表名

创建索引

alter table 数据库add index 索引名称(数据库字段名称)

PRIMARY KEY(主键索引)

ALTER TABLE table_name ADD PRIMARY KEY ( column )

UNIQUE(唯一索引)

ALTER TABLE table_name ADD UNIQUE (column)

INDEX(普通索引)

mysql>ALTER TABLE table_name ADD INDEX index_name ( column )

FULLTEXT(全文索引)

ALTER TABLE table_name ADD FULLTEXT ( column )

多列索引

ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

三、存储结构

B+树

Hash

hash存储结构的利与弊

倒排索引(反向索引)

词典+倒排列表

反转索引(B+树)

    比如'1234'存储在索引中的键值是'4321'
    解决热点数据块

四、数据库中对于不同数据类型怎么排序

数值型(int,long等) : 按照数值的大小排序

时间型

是按照时间的大小排序??????

当然不是,在数据库中,会将时间,转化成时间戳Long类型,所以,最终时间也是按数值进行排序的。

文本型(varchar、text等) : 

那么文本型又是怎么排序的?????

显然,肯定是数值型,为什么会是数值型????

因为计算机不认识字啊

每个文字在计算机中都对饮一个数字,就根据这些数字来排序

五、索引失效

1、区分度

区分度低,不走索引。当表的索引被查询,会使用最好的索引,除非优化器使用全表扫描更有效。优化器优化成全表扫描取决与使用最好索引查出来的数据是否超过表的30%的数据。

范围查询索引有效失效就是区分度的问题。mysql 是否根据首次索引(二级索引查询)条件查询出的主键进行二次查找(主键索引),也是要看查询出来的数据量级,如果数据量接近全表数据量的话,就会进行全表扫描,否则根据第一次查询出来的主键进行二次查询。

如果组合索引中包含的列,有范围查询,那么它之后的列将不会走索引(范围之前的列同样需要区分度要求)

2、优化器会放弃使用索引其他情况

image.png

参考

www.cnblogs.com/aquilahkj/a… blog.csdn.net/dgutliangxu…