数据库索引详解
- 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
如何选择合适的列建立索引
- 从where从句中,group by从句中,order by从句中,on从句中,select列中,还可以建立覆盖索引(也就是指索引包含所有查询的列,直接查索引就可以完成任务的)。
- 索引字段越小越好,因为mysql存储是以页为单位的,如果从单页中获取更多的结果,减少IO操作,那么就起到了积极的作用。
- 离散程度越高的列放在联合索引的前面,因为离散度越大的列可选择性越高,可以通过count统计函数查看离散度 离散度: distinct 值越大,唯一值越多,它的离散度越高,可选择性越高。
索引抑制
- 索引抑制是指特定的关联条件导致一些索引无法使用,从而导致SQL执行计划效率较低。
- 常见的5种索引抑制情况:
- 使用不等于运算符
- 使用IS NULL 或 IS NOT NULL
- 使用LIKE(不支持左模糊 like '%xx')
- 使用函数,如:TRUNC
- 关联条件存在隐式转换(不匹配的数据类型)
创建索引的语法
- 创建一个普通的索引(一个最简单的索引 没有任何限制)
方式1: create index indexname on tableName(columnName(length));
方式2:alter tableName add index [indexName] on (columnName(length));
方式3: create table mytable(id int not null,username varchar(16) not null,
index [indexName](columnName(length)));
- 删除索引
drop index [indexName] on tableName;
- 唯一索引(索引列的值必须唯一,但可以为null;如果是多个字段组合索引,那么列值得组合唯一)
方式1:CREATE UNIQUE INDEX indexName ON tableName(columnName(length))
方式2:ALTER tableName ADD UNIQUE [indexName] ON (columnName(length))
方式3:CREATE TABLE tableName( ID INT NOT NULL, username VARCHAR(16) NOT
NULL, UNIQUE [indexName] (columnName(length)) );
- 主键索引 : primary key