原标题:MySQL中如何使用索引
者:Airy 在数据分析之路狂奔,立志成为大咖级人物。
前言
学完基础的MySQL知识,以及MySQL的增删改查,我们要学习一些性能方面的东西。今天来讲一下索引(Index)。
索引
在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
对于任何DBMS,索引都是查询优化的最主要方式。当数据量非常大时,如果没有合适的索引,数据库的查询性能会急剧下降。
My SQL中的索引分类
1、普通索引
这是最基本的索引,它没有任何限制。
2、唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3、主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
4、聚簇索引
聚簇索引的索引顺序就是数据存储的物理存储顺序,这样能保证索引值相近的元组所存储的物理位置也相近。
5、全文索引(FULLTEXT)
全文索引只能创建在数据类型为VARCHAR或TEXT的列上,建立全文索引后,能够在建立了全文索引的列上进行全文查找。全文索引只能在MyISAM存储引擎的表中创建。
实际工作使用中,索引可以建立在单一列上,称为单列索引,也可以建立在多个列上,称为组合索引。
查看数据表上所建立的索引
MySQL中使用SHOW INDEX能够查看数据表中是否建立了索引,以及所建立索引的类型及相关参数,语法格式如下:
SHOW {INDEX | INDEXES | KEYS} {FROM | IN } tb_name[{FROM | IN } db_name];
该语句的功能是显示出表名为tb_name的表上的所有定义的索引名及索引类型,看一个例子。
SHOW INDEX FROM db_school.tb_student;
执行上面的语句后,以二维表的形式显示建立在表tb_student上的所有索引的信息,由于屏幕显示的项目较多,不易查看,可以在语句最后使用G参数,如图所示。
其中比较重要的几项如下:
Table:指明索引所在表的名称。
Non_unique:该索引是否不是唯一性索引。如果不是值为1,如果是值为0。
Key_name:索引的名称。
Column_name:建立索引的列名称。
Collation:说明以何种顺序(升序或降序)索引。升序是A,如果值是NULL,则表示无分类。
创建索引
1、使用CREATE TABLE创建索引
使用CREATE TABLE语句可以在创建该表的时候创建索引。语法格式如下:
CREATE TABLE tb_name [col_name data_type]
[CONSTRAINTindex_name] [UNIQUE] [INDEX | KEY]
[index_name](index_col_name[length])[ASC | DESC]
语法说明:
Tb_name:指定需要建立索引的表名。
Index_name:指定所建立的索引名称。索引名称必须唯一。
UNIQUE:可选,指定所创建的是唯一性索引。
index_col_name:指定要创建索引的列名。通常可考虑将查询语句中在WHERE子句和JOIN子句里出现的列作为索引列。
ASC | DESC:可选项,指定索引是按升序(ASC)还是降序排列,默认升序。
看一个例子:
#创建tb_score1,增加主键和外键的子句。
CREATE TABLE tb_score(
studentNo CHAR(10),
courseNo CHAR(6),
score FLOAT,
CONSTRAINT PK_score PRIMARY KEY(studentNo, courseNo),
CONSTRAINT FK_score1 FOREIGN KEY(studentNo) REFERENCEStb_student(studentNo),
CONSTRAINT FK_score2 FOREIGN KEY(courseNo) REFERENCEStb_course(courseNo)
)ENGINE=INNODB;
执行上面的语句之后,创建了tb_score1表,同时在表上创建了包含studentNo、courseNo两个字段的主键,系统自动建立了索引。建立外键时,系统也自动为外键列建立索引。
执行SHOW INDEX 语句查看一下该表上的索引。结果如下图所示:
SHOW INDEX FROM db_school.tb_score1G;
2、使用CREATE INDEX创建索引
用CREATE INDEX语句能够在一个已经存在的表上建立索引,语法如下。
CREATE [UNIQUE] INDEX index_name
ONtb_name (col_name [(length)] [ASC | DESC],...)
下面看一下实例:
#创建普通索引
CREATE INDEX index_stu ON db_school.tb_student(studentNo);
#创建基于字段值前缀字符的索引
CREATE INDEX index_course ON db_school.tb_course(courseName(3)DESC);
3、使用ALTER TABLE创建索引
在MySQL中,除了使用CREATE INDEX语句在一个已存在的表上建立索引之外,还可以使用ALTER TABLE实现类似的功能。语法格式如下:
ALTER TABLE tb_name ADD [UNIQUE | FULLTEXT][INDEX | KEY] [index_name] (col_name [(length)] [ASC | DESC],...)
看一个例句:
#使用ALTER TABLE创建普通索引
ALTER TABLE db_school.tb_student ADD INDEX idx_studentName(studentName);
删除索引
MySQL中,使用DROP INDEX或ALTER TABLE能够删除一个不再需要的索引。
下面看一下例句,把之前创建的索引删除:
DROP INDEX idx_studentName ON db_school.tb_student;
ALTER TABLE db_school.tb_student DROP INDEXindex_stu;
需要注意的问题
1、索引过多时
索引过多时,会影响系统的性能。主要原因有:(1)降低更新表中数据的速度。(2)增加存储空间。索引也会占用磁盘空间,在一个大表上创建了很多索引的话,索引文件的大小会膨胀的非常快。
2、使用索引的建议
在插入、修改、删除操作较多的数据表上避免过多地建立索引。
数据量较小的表最好不要建立索引。
使用组合索引时,严格遵循左前缀法则,即先按照第一列(最左字段)进行排序,第一列字段值相同时,对第二列进行排序。
在查询表达式中经常使用、有较多不同值的字段上建立索引。
在WHERE子句中尽量避免将索引列作为表达式的一部分。
若CHAR或VARCHAR列的字符数很多,则可视具体情况对索引列的前缀建立索引,这样可以节约存储空间。返回搜狐,查看更多
责任编辑: