MySQL的索引的分类:
一、单值索引(普通索引)
二、唯一索引
三、复合索引
四、主键索引
五、Full-text索引(全文索引)
单值索引
普通索引:即只包含一个列的索引,一个表可有多个单值索引
创建索引的语句:
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 ,
`name` char(255) CHARACTER NOT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (name(length))
)
唯一索引
索引的值必须是唯一的,但是允许有空值
创建索引的语句:
CREATE UNIQUE INDEX indexName ON table(column(length))
或
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
或
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` char(255) CHARACTER NOT NULL ,
UNIQUE indexName (name(length))
);
复合索引
一个索引包含多个列,但是使用复合索引的时候需要遵循最佳左前缀法则(即查询从索引最左列开始,并且不跳过索引中的列)
创建索引的语句:
ALTER TABLE `table` ADD INDEX name_addr_age (name,addr,age);
主键索引
特殊的一种索引,不允许有空值,在表创建时便同时创建
Full-text索引(全文索引)
主要是用来查找文本中的关键字,只有在char varchar text的列上创建该索引
(tips:如果在创建大数据量的表的时候,建议先插入数据再建该索引)
(原因:索引便于查找,但是对于增删频繁的表来说会变得更消耗性能)
创建索引的语句:
CREATE FULLTEXT INDEX index_content ON table(content)
或
ALTER TABLE table ADD FULLTEXT index_content(content)
或
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`content` text CHARACTER NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);
需要建立索引的情况
1. 频繁作为查询的字段
2. 外键关系
3. 查询中排序的字段,排序字段如果通过索引进行查询会提高排序的效率
4. 查询中统计或分组字段
待补充!!!
不需要建立索引的情况
1. 表记录太少
2. 经常增删的表(因为更新表的时候,会同时更新索引,保存索引的文件,加重IO负担)
3. 数据列中的内容重复且分布平均
待补充!!!
索引失效的情况
1. 复合索引使用时不遵循最佳左前缀法则
2. 在索引列上进行计算、函数、类型转换(包含隐式)会导致索引失效而进行全表扫描
3. 减少使用select *
4. like “%aaa%” 不会使用索引而like “aaa%”可以使用索引
5. 字符串不加单引号会导致索引失效
6. Is null和is not null 会导致索引失效
待补充!!!