数据库索引 + 执行计划

基本概念

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值