全网最大最稳定的免费资源网站
零度资源网

数据库对于索引优化和SQL语句优化重要吗?

数据库对于索引优化SQL语句优化重要吗?

零度小编今天给大家示例一下:

这一段时刻一直在学习关系型数据库,准备写一个小专题来总结一下这一段时刻的学习成果。

话说数据库优化一直是SQL型数据库的热门问题,包含从网络I/O方面,从硬盘I/O方面,从CPU计算方面等等很多手法,都能够对数据库进行优化。

这篇文章主要总结了如何树立适宜的索引提高查询速度,如何经过优化SQL提高句子履行速度。

当然这些探讨都是浅尝辄止的,假如有任何错误,希望大家指出。

一. 索引优化 1.1 树立集合索引 1.2 常查询数据树立索引 1.3 最左前缀准则 1.4 不要树立无意义的索引 二. SQL句子优化 2.1 查询句子尽可能运用索引 2.2 常见的技巧 2.2.1 确保不查询剩余的列与行 2.2.2 慎用distinct关键字 2.2.3 运用连接(join)来替代子查询 2.2.4 运用limit对查询成果的记录进行限制 2.2.5 一次提交多个insert句子

一. 索引优化
1.1 树立集合索引
首先聚合索引是提高查询速度的最有效的手法。根据聚合索引的性质,咱们能够了解到,数据库的物理存储次序是按照聚合索引次序排列的,而经过聚合索引的B+树,咱们能够敏捷的查找到任何一行的悉数信息,注意是悉数信息。

不了解集合索引的同学能够参考我的 数据库(3)数据库索引这篇文章。

在Mysql中,InnoDB引擎会默许主键索引为集合索引,所以树立一个表时,咱们应该优先设立一个主键,后边所有根据主键的WHERE条件查询句子都会运用到这个集合索引。

主键索引的选取,能够参考以下准则:

一行数据仅有的身份标识(数据库原理中叫做候选码),能够是几列的组合 额定添加的字段,用来仅有标识一行,通常是自增的id

CREATETABLEtest(
idINTPRIMARYKEY,
# 其他字段
);
一起需求特别注意的是,假如在一个表有很多数据的情况下,添加了主键,那么会导致这个表重新对硬盘上的存储结构做调整,这是一个费时的进程,所以引荐在建表时就树立主键,从而取得集合索引。

1.2 常查询数据树立索引
咱们知道,关于数据的查询,一般是经过条件查询(WHERE句子),而假如条件查询中的字段上没有树立索引的话,就会进行一次全表扫描,这是十分耗时的操作。

CREATETABLEtest(
idINT,
nameVARCHAR(20)
); // 假定test表没有任何索引

SELECTnameFROMtestWHEREid=100; // 这条句子会导致全表查询,然后再进行where句子挑选(没有支撑ICP的情况下)
这时候咱们需求对id字段树立索引

CREATEINDEXindex_name
ONtable_name (id)
这样再进行查询句子就会运用B+树进行索引查询得到id=100的索引叶节点,然后根据查到的聚合索引的值,进行二次查找得到name

这是由于非集合索引的叶子节点存储结构相似下图。

这儿写图片描述

更好的解决方案是树立一个组合索引<喎�”/kf/ware/vc/” target=”_blank” class=”keylink”>vcD4NCjxwcmUgY2xhc3M9″brush:sql;”> CREATE INDEX index_name ON table_name (id,name)

这样就不需求进行二次查询,而是直接彻底经过索引B+树的叶子节点内容久能得到name

1.3 最左前缀准则
其实在上一篇文章中现已说过这个东西了,这儿再拿出来说一下的原因是,有些索引你尽管树立了,但数据库不见得会用到这种查询手法。

比方说你树立了一个表:

CREATETABLEtest(
name_1CHAR(20),
name_2CHAR(20),
name_3CHAR(20),
INDEXindex_1 (name_1,name_2,name_3)
);
树立了一个组合索引(name_1,name_2,name_3)

然后你乐滋滋的进行了一波查询:

SELECTname_1FROMtestWHEREname_1=’haha’;
SELECTname_1FROMtestWHEREname_2=’wuwu’;
SELECTname_1FROMtestWHEREname_3=’yingyingying’;
SELECTname_1FROMtestWHEREname_1=’haha’ANDname_2=’wuwu’;
SELECTname_1FROMtestWHEREname_1=’haha’ANDname_3=’yingyingying’;
咱们逐条来分析这些句子会如何运用索引进行查询:

查询字段name_1在树立的索引里,而条件句子中WHERE name_1=’haha’也在索引里,并且契合最左前缀规则,索引毫无疑问,这次查询会直接运用索引查询,并且查询数据在索引叶子节点里,查询功率是很高的。 查询字段name_1在树立的索引里,而条件句子中WHERE name_2=’wuwu’也在索引里,但不契合最左前缀准则,这种查询不会运用到B+树的优异特性,而是会进行全索引查询,然后再比较WHERE句子条件 和上面那种情况相同,也是会进行全索引查询,然后再比较WHERE句子条件 查询字段name_1在树立的索引里,条件句子WHERE name_1=’haha’ AND name_2=’wuwu’字段在索引里,并且契合最左前缀准则,因此会运用B+树的性质进行查询,功率是很高的。 WHERE name_1=’haha’ AND name_3=’yingyingying’条件句子违背了最左前缀准则,需求进行全索引查询,并且这种写法会进行两次WHERE句子条件的比较,功率及其低下。

能够看到,树立组合索引优化查询句子时,一定要考虑到最左前缀准则,不然你的索引树立的能够说毫无意义。

1.4 不要树立无意义的索引
什么是无意义的索引?

基本上就是和上面体到的准则抵触的索引类型:

查询次数很少的句子中的字段的索引,由于树立索引是会降低数据表DML(INSERT,UPDATE,DELETE)功能的,假如一条句子查询句子一天都用不到几回,你却为它树立了繁杂的索引,那么将会导致数据表很不科学。 补白描述和大字段的索引,比方数据库中存储了文章字段,假如对这个字段添加了索引,那么将会添加十分多的额定磁盘占用开支,并且查询功率并不能得到很大的提高。 日期,年月,状态位,长字符,这些字段在数据库规划是尽量要满意3NF的要求,经过主键或许仅有键就能取得这些信息,尽量不要依据这些信息树立索引进行查询。

二. SQL句子优化
关于这方面我是真的不敢信口开河,由于我也仅仅处于学习阶段,因此也只总结一些常见的优化手法。

2.1 查询句子尽可能运用索引
这是显而易见的一条准则,咱们知道B树这种数据结构实在是太适合数据库存储了,查询功能比起次序查询高出太多倍了,因此假如能运用到自己树立的索引,那么就会极大的提高查询句子的功能。

SQL什么条件会运用索引?

当字段上建有索引时,通常以下情况会运用索引,在WHERE句子中:

INDEX_COLUMN = x
INDEX_COLUMN > x
INDEX_COLUMN >= x
INDEX_COLUMN < x
INDEX_COLUMN <= x
INDEX_COLUMNbetweenxandx
INDEX_COLUMNin(x,y,…,z)
INDEX_COLUMNlike’x’或许’x%’(后导模糊查询)
T1. INDEX_COLUMN=T2. COLUMN1(两个表经过索引字段关联)
以上x,y,z代表任何和INDEX_COLUMN同一类型的数据

一起防止查询时不能运用索引查询的数据:

 

转载请注明:  零度资源网

本文原网址:https://0dzyw.com/1974.html/

赞(0)
未经允许不得转载:零度资源网 » 数据库对于索引优化和SQL语句优化重要吗?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

零度资源网

资源网标签资源网地图