基本概念
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息(From 百科)
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
其实可以这么理解,索引就等于是字典的查询目录,你是在字海里查东西快还是通过查询目录来查询快呢,显而易见。
索引种类:聚簇索引和非聚簇索引,聚簇索引是按照数据存放的物理位置为顺序的。
注意:不是说索引越多就越好,索引会增加插入和更新表的开销,对于经常要插入和更新缺很少查询的表,建议不设置索引,所以具体情况需要具体分析。
索引介绍
普通索引
关键字:index
------------------index-------------------
CREATE INDEX index_name ON table_name(column_name(length))
ALTER TABLE table_name ADD INDEX index_name ON (column_name)
唯一索引
关键字:unique index;
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似
----------------------index-----------------------------
CREATE UNIQUE INDEX index_name ON table_name(column_name)
ALTER TABLE table_name ADD UNIQUE index_name ON (column_name)
----------------------create-----------------------
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) NOT NULL ,
PRIMARY KEY (`id`),
UNIQUE index_name (title)
);
主键索引
关键字:primary key
必须为主键创建的唯一索引。、
PRIMARY KEY (`id`),
全文索引
关键字:FULLTEXT
作用于CHAR、VARCHAR或TEXT,如果数据量大,建立索引耗时很严重。
-------------------FULLTEXT-------------------------------
ALTER TABLE table_name ADD FULLTEXT index_name(column_name)
CREATE FULLTEXT INDEX index_name ON table_name (column_name)
组合索引
关键字:index
建立多个字段的一起查询的索引。建立索引遵从最左前缀原理,就是从最左边开始组合。
ALTER TABLE article ADD INDEX index_mul(first(20),second(20))
实际上的索引是:
first
first,second
最左前缀原理
索引优化
索引经验值
动作描述 | 聚集索引 | 非聚集索引 |
---|---|---|
列经常被分组排序 | 使用 | 使用 |
返回某范围内的数据 | 使用 | 不使用 |
一个或极少不同值 | 不使用 | 不使用 |
小数目的不同值 | 使用 | 不使用 |
大数目的不同值 | 不使用 | 使用 |
频繁更新的列 | 不使用 | 使用 |
外键列 | 使用 | 使用 |
列经常被分组排序 | 使用 | 使用 |
主键列 | 不使用 | 使用 |
最好不要有NULL值
只要列中包含有NULL值都将不会被包含在索引中。复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。
短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
索引排序
MYSQL只会使用一次索引,where使用了索引的话,order by就不会使用索引。
不要再字段上进行运算
在字段上运算会导致索引失效。
like 语句操作
like %xx%会使索引失效,因为最左前缀原因。like xx%则不会失效。
索引生效的操作
<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)
执行计划
数据库中,使用explan命令就可以查看详细的sql语句的执行详情,称为执行计划
举例:
explain select * from xxx where xxx=xxx
返回的结果如下(只做简介)
id:查询的序列号,越大表明越先执行。
select_type:查询的类型,主要区别普通查询和联合查询等:
table:输出的行所引用的表,尖括号括起来表明是临时表。
type:查询的类型,表明是否使用了索引,和使用了什么索引。
possible_key:查询时可能使用到的索引。
key:查询时真正使用的索引。
key_len:使用索引的长度,所有使用到的索引的总长度
ref:常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段
rows:估算的扫描行数。
Extra:扩展字段,可显示的信息非常多。
可参考的资料:http://www.cnblogs.com/xiaoboluo768/p/5400990.html