进行SQL查询时候,如果数据庞大,查询速度会变得很慢,需要用到索引来加快速度。方法如下:
一、创建索引方法
1、使用CREATE INDEX 语句创建索引
查看索引:SHOW INDEX FROM 表名;
创建索引:CREATE [UNIQUE | FULLTEXT] INDEX 索引名 ON 表名 (表字段,...) ;加参数 UNIQUE 增加唯一键索引,FULLTEXT 全文索引 不加普通索引
前缀索引:create index 索引名 ON 表名 (字段(前n个字符));
删除索引:DROP INDEX 索引名 ON 表名;
查看语句是否使用索引:explain sql语句 type=ALL 没有使用 type=ref 使用索引
2、使用ALTER TABLE 语句创建索引
ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
//普通索引
alter table table_name add index index_name (column_list) ;
//唯一索引
alter table table_name add unique (column_list) ;
//主键索引
alter table table_name add primary key (column_list) ;
//删除索引
alter table table_name drop index index_name ;
ALTER TABLE可用于创建普通索引、UNIQUE索引和PRIMARY KEY索引3种索引格式,不能用CREATE INDEX语句创建PRIMARY KEY索引
使用合理的索引结构可以显著提高SQL的查询效率和性能,减少数据库状态和内存消耗,从而实现服务器性能的优化。
索引类型
普通索引:INDEX 允许出现相同的索引内容 (normal)
唯一索引:UNIQUE 不可以出现相同的值,可以有NULL值
主键索引:PROMARY KEY 不允许出现相同的值(唯一性,且只能有一个)
组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一
全文索引:FULLTEXT INDEX 可以针对值中的某个单词,但效率低(不建议,可利用添加关键词关联列来实现)
二、注意事项和设计技巧
1)、索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,组合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2)、使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3)、索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4)、like语句操作。一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like "%aaa%" 不会使用索引而like "aaa%"可以使用索引。
5)、不要在列上进行运算,这将导致索引失效而进行全表扫描
6)、不使用not in和<>判断操作
NOT IN 、<>、!=不使用索引,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的。not in和<> 这将导致索引失效,可以考虑使用exists 或 not exists 来代替in 和 not in (注意 in操作 是可以利用索引的),使用between and 区间 来代替<>判断操作。
7)、EXPLAIN可以帮助开发人员分析SQL问题。explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。使用方法,在select语句前加上Explain就可以。
8)、索引要建立在值比较唯一的字段上
9)、索引要建立在经常进行select操作的字段上。这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
10)、对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。
11)、在where和join中出现的列需要建立索引
12)、如果where字句的查询条件里使用了函数(如:where YEAR(column)=...),mysql将无法使用索引
13)、在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。
14)、当where条件中存在 字符串与数字比较时(数据类型相同)不使用索引,用到OR 关键词时也不会使用索引
三、在实际操作过程中,应该选取表中哪些字段作为索引?
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引:
1)、选择唯一性索引
2)、为经常需要排序、分组和联合操作的字段建立索引,特别是where后面的字段
3)、为常作为查询条件的字段建立索引
4)、限制索引的数目
5)、尽量使用数据量少的索引
6)、尽量使用前缀来索引
7)、删除不再使用或者很少使用的索引
8)、表的主键、外键必须有索引;
9)、经常与其他表进行连接的表,在连接字段上应该建立索引;
10)、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替。如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
11)、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
12)、复合索引与单字段索引是互不冲突的。如果你建立了复合索引,而你的查询条件基本上都包含了复合索引中的字段那就不用建了,如果你针对复合索引中包含的字段,以单字段作为查询条件的情况多的话,那么也可以对单个字段再建索引的