SQL

Wesley13
• 阅读 570

当数据库中数据量特别大的时候,查询的速度就比较慢,这时候需要添加索引,来提高查询速度。

索引的优点

1>通过创建唯一索引,可以保证数据库表中每行数据的唯一性。

2>加快数据查询速度

3>在使用分组和排序进行数据查询时,可以显著的减少查询中分组和排序的时间

索引的缺点

1>维护索引需要消耗数据库资源

2>索引需要占用磁盘空间,索引文件可能会比数据库文件更快达到文件的最大尺寸

3>对表的数据进行增/删/改的时候,需要维护索引,所以会影响增/删/改的速度

索引的分类

1.普通索引和唯一索引

主键索引是一种特殊的唯一索引,不允许有空值。

2.单索引和复合索引

单索引只包含单个列

复合索引,指在多个字段上创建索引,查询时,只有使用了第一个索引字段时,其它索引才会被使用,使用复合索引时遵循最左前缀集合。

3.全文索引

全文索引类型为fulltext,在定义索引的列上支持值的全文查找,允许这些索引列的值重复且可以为空值,全文索引可以在char、varchar、text类型列上创建。

使用explain,我们知道mysql如何使用索引来处理select语句以及连接表,可以帮助我们选择更好的索引和写出更优化的查询语句。如下示例

SQL

explain详解

1.id

它是sql语句执行的顺序。如上示例可以看出先执行外层select,再执行内层select。

2.select_type

它提供了各种“列属性”引用的类型,最常见的值包括如下

1>simple    表示简单的select,没有union和子查询。

2>primary    最外面的select,在有子查询的语句中,最外面的select查询就是primary,如上例子就是

3>union    SQL语句中带有union   

4>derived    当查询的表不是一个物理表时,那么它就叫做derived。如上示例tt表不是一个物理表

3.table

很明显,它是查询所用的表

4.type

表示mysql在表中找到所需要记录的方式,又称为"连接类型"或"访问类型",从最好到最差依次如下

system:表示只有一行记录(等于查询系统表)

const:表示表中最多只有一行匹配的记录

range:只检索给定范围的行,key列显示使用了哪个索引。当使用=、>、<、between操作符时,可以使用range

index:全表扫描,只是扫描表的时候按照索引次序进行而不是行,主要优点是避免了排序,但是依然消耗很大的开销

all:最坏的情况,从头到尾全表扫描

5.possible_keys

表示mysql在搜索表记录时可能会使用哪个索引。注意,该字段完全独立于explain显示的表顺序,因此,possible_keys里面所包含的索引可能在实际的使用中并没有用到,即这个字段的值是null时,就表示没有索引被用到。

6.key

该字段表示mysql查询实际使用的索引,当没有任何索引被用到的时候,该字段值为null。

7.key_len

该字段表示mysql使用索引的长度,当key字段值为null时,索引的长度就是null。例如上述例子中,主键的长度是int类型,长度为10,这就至少需要4位来表示,所以索引的长度为4。

8.ref

该列表示 使用哪个列或常数与key一起从表中选择行

9.rows

表示mysql执行查询的行数,该数值越大,越不好,表明没有用好索引

10.extra

该字段显示了mysql查询过程中的附加信息,常见信息如下

Using index : 表示mysql使用了覆盖索引

Using where : 表示mysql在存储引擎检索后再进行过滤

Using temporary : 表示mysql对查询结果排序时会用到一个临时表

Using filesort : 表示mysql会对结果使用一个外部索引排序,即mysql使用where后面的索引查询结果,使用order by 后面的索引排序

distinct:mysql找到当前记录匹配结果的第一条记录之后,就不再搜索其他记录了

not exists:mysql在查询时做一个left join优化时,在当前表中找到与前一条记录符合left join条件之后,就不再搜索其他的记录了。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
MySQL千万级别优化·中
MySQL千万级别的查询优化手段·中单列索引(假设在v\_record表中存在id列的索引)1、WHERE条件使用​EXPLAINSELECT\FROMv\_recordWHEREid2​结论:利用索引进行回表查询2、SELECT字段使用
Wesley13 Wesley13
2年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Wesley13 Wesley13
2年前
Mysql索引最佳实践笔记0524
mysql5.7innodb默认存储引擎一、关于索引二、最佳实践三、避坑实践一、关于索引1.索引的作用提高查询效率数据分组、排序避免回表查询优化聚集查询用于多表join关联查询利用唯一性约束、保证数据唯一性innodb行锁实现索引的“
Wesley13 Wesley13
2年前
mysql——索引——概念
一、索引索引由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度。索引是创建在表上面的,是对数据表中一列或者多列的值进行排序的一种结构。通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列。索引优点:提高检
Stella981 Stella981
2年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究