MySQL索引

来源:互联网 发布:打印机接收数据 不打印 编辑:程序博客网 时间:2024/05/17 02:07

1、概念
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

2、类型

1)普通索引
这是最基本的索引,它没有任何限制。
MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

–直接创建索引CREATE INDEX index_name ON table(column(length))–修改表结构的方式添加索引ALTER TABLE table_name ADD INDEX index_name ON (column(length))–创建表的时候同时创建索引CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),INDEX index_name (title(length)))–删除索引15DROP INDEX index_name ON table

2)唯一索引
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。
如果是组合索引,则组合列的值必须唯一。

CREATE UNIQUE INDEX indexName ON table(column(length))

3)组合索引(最左前缀)

ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))

相当于创建了两个索引:
–title,time
–title
这是因为MySQL组合索引“最左前缀”的结果,简单的理解就是只从最左面的开始组合。

–使用到上面的索引SELECT * FROM article WHREE title='测试' AND time=1234567890;SELECT * FROM article WHREE utitle='测试';–不使用上面的索引SELECT * FROM article WHREE time=1234567890;

4)全文索引

3、索引的优化

1)索引列非NULL

  索引列包含有NULL值,则该索引失效。  复合索引中只要有一列含有NULL值,则此复合索引失效。  所以我们在数据库设计时不要让字段的默认值为NULL。

2)like语句

     like “%aaa%”,索引失效。     like “aaa%”可以使用索引

3)短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

4)索引列运算

select * from users where YEAR(adddate)<2007

在索引列上进行运算,则索引失效。

select * from users where adddate<’2007-01-01

此索引有效。

5)or语句

select * from users where id = 170 or user_id = 990

若只有id为索引列,则此处索引失效;若使此索引有效,则or所有条件必须皆为索引列。

原创粉丝点击