SQL之索引
一、索引的概念
索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一旦建立了索引后,数据库中查询优化器使用索引来快速定位数据,然后就无需扫描表中给定查询的每一行了。
二、索引的特点
优点:
- 通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。
- 可以加快数据的检索速度
- 可以加速表与表之间的连接
- 在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间
缺点
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
- 索引需要占用物理空间,数据量越大,占用空间越大
- 会降低表的增删改的效率,因为每次增删改索引,都需要进行动态维护
什么时候需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中排序的字段创建索引将大大提高排序的速度
- 查询中经常统计或者分组的字段可以建立索引
什么时候不需要创建索引
- 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件
- where条件里用不到的字段,不创建索引
- 表记录太少,不需要创建索引
- 经常增删改的表
CREATE INDEX index_name ON table_name (column_list)
创建索引的一个例子:
CREATE INDEX jobTitle ON employees(jobTitle);
在表employees的列名为jobTitle的列上建立索引jobTitle。
这时测试索引的效率可以将SQL语句的解释内容打出来:
EXPLAIN SELECT employeeNumber, lastName, firstName FROM employees WHERE jobTitle = 'Sales Rep';
创建表的时候指定索引:
Create table t1( id int, name char(10), Index index_name(id))
增加/修改索引:
ALTER TABLE tablename ADD INDEX index_name (column_list)
CREATE UNIQUE INDEX index_name ON tablename (column_name);
Create table t1( Id int, name char(10), Unique key uni_name (id,name) )
修改/增加索引:
ALTER TABLE tablename ADD UNIQUE index_name (column_list)
Alter table tablename add primary key(id)
创建表时指定主键(两种方式):
Create table t1( Id int primary key )
Create table t1( Id int, Primary key(id) )
修改/删除主键索引:
Alter table tablename drop primary key;
CREATE CLUSTERED INDEX index_name ON tablename(column_list)
四、注意事项
并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。在表较大时再建立索引,表中的数据越多,索引的优越性越明显。考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。
原文链接:https://www.jianshu.com/p/f588c41f1cb5