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

相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys2 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi2 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据3 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi4 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀4 小时前
Redis梳理
数据库·redis·缓存
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天4 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺5 小时前
分布式系统架构:服务容错
数据库·架构
独行soc6 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘