SQL创建索引加快查询速度的方法

进行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)、复合索引与单字段索引是互不冲突的。如果你建立了复合索引,而你的查询条件基本上都包含了复合索引中的字段那就不用建了,如果你针对复合索引中包含的字段,以单字段作为查询条件的情况多的话,那么也可以对单个字段再建索引的

相关推荐
木鬼与槐3 小时前
MySQL高阶1831-每天的最大交易
数据库·mysql
晴天qt015 小时前
[mysql]mysql排序和分页
数据库·mysql
小张同学(恩师白云)6 小时前
SpringDataJPA基础增删改查
java·数据库
Jasonakeke8 小时前
【重学 MySQL】三十四、加密与解密函数
数据库·mysql
一知半解搞开发8 小时前
Mysql系列-索引简介
java·数据库·mysql
akhfuiigabv8 小时前
使用Neo4j-Cypher-FT实现自然语言查询图数据库
数据库·python·oracle·neo4j
Aa134517650258 小时前
c#中使用sql防注入方式写入数据
数据库·sql·c#
木木ainiks8 小时前
django自用教程
数据库·django·sqlite
akhfuiigabv9 小时前
探索Timescale Vector与Postgres数据库的融合:AI应用的新选择
数据库·人工智能·python
自身就是太阳9 小时前
Maven的高级特性
java·开发语言·数据库·后端·spring·maven