推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

MySQL 索引优化全攻略

   2023-08-04 网络整理佚名1450
核心提示:BTREE,通过BTREE算法建立索引的字段,比如扫描20行就能得到未使用BTREE前扫描了2^20行的结果。可以帮助开发人员分析SQL问题,显示了mysql如何使用索引来处理语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。:导出表的(from子句的子查询)。

所谓索引就是针对特定的mysql字段进行一些特定的算法排序,比如二叉树算法、哈希算法等。 哈希算法就是建立一个特征值,然后根据特征值快速查找。 使用最多,并且mysql默认的是二叉树算法BTREE。 以BTREE算法索引的字段为例,在使用BTREE之前扫描20行得到扫描2^20行的结果。

优化查询检测

它可以帮助开发人员分析SQL问题,展示mysql如何使用索引来处理语句和连接表,并且可以帮助选择更好的索引和编写更优化的查询语句。

使用时只需在语句前添加:

Explain select * from blog where false;

在执行查询之前,mysql会分析每条发送的SQL来决定是使用索引还是全表扫描。 如果你发送一个* from blog where false,Mysql将不会执行查询操作,因为已经被SQL分析器分析过了,MySQL清除后没有语句会匹配该操作。

例子

mysql> EXPLAIN SELECT `birday` FROM `user` WHERE `birthday` < "1990/2/2"; 
-- 结果: 
id: 1 
select_type: SIMPLE -- 查询类型(简单查询、联合查询、子查询) 
table: user -- 显示这一行的数据是关于哪张表的 。
type: range -- 区间索引(在小于1990/2/2区间的数据),这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,const代表一次就命中,ALL代表扫描了全表才确定结果。一般来说,得保证查询至少达到range级别,最好能达到ref。 
possible_keys: birthday  -- 指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。  
key: birthday -- 实际使用到的索引。如果为NULL,则没有使用索引。如果为primary的话,表示使用了主键。 
key_len: 4 -- 最长的索引宽度。如果键是NULL,长度就是NULL。在不损失精确性的情况下,长度越短越好。
ref: const -- 显示哪个字段或常数与key一起被使用。  
rows: 1 -- 这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。 
Extra: Using where; Using index -- 执行状态说明,这里可以看到的坏的例子是Using temporary和Using

:简单(不使用联合或子查询)。 : 最外面的。 union:联合中的第二个或后续语句。 Union:联合中的第二个或后续语句,具体取决于外部查询。 联合:联合的结果。 : 子查询中的第一个。 :子查询中的第一个依赖于外部查询。 :导出表(from子句的子查询)。

其他说明

:一旦 MYSQL 找到与行并集匹配的行,它就不再搜索。 不是:MYSQL优化了LEFT JOIN,一旦找到符合LEFT JOIN条件的行,它就不再搜索。 每个范围(索引映射:#):没有找到理想的索引,因此对于前一个表中的每个行组合,MYSQL 检查要使用哪个索引并使用它从表中返回行。 这是使用索引最慢的连接之一。 使用 :当你看到这个时,查询需要优化。 MYSQL 需要执行额外的步骤来发现如何对返回的行进行排序。 它根据连接类型和存储排序键值的行指针以及匹配条件的所有行对所有行进行排序。 使用索引:从表中返回列数据,仅使用索引中的信息,而不实际读取操作。 当表的所有请求列都是同一索引的一部分时,就会发生这种情况。 当Using看到这个时,查询需要优化。 这里,MYSQL需要创建一个临时表来存储结果,这通常发生在不同列集的ORDER BY上,而不是GROUP BY上。 使用的地方使用 WHERE 子句来限制哪些行将与下一个表匹配或返回给用户。 如果您不想返回表中的所有行,并且联接类型为 ALL 或索引,或者查询在解释不同的联接类型(按效率顺序排序)时出现问题,则可能会发生这种情况。 一张表只有一行:表。 这是 const 连接类型的特例。 const:表中能够匹配本次查询的记录的最大值(索引可以是主键,也可以是唯一索引)。 因为只有一行,所以这个值实际上是一个常量,因为MYSQL首先读取这个值并将其视为常量。 :在连接中,MYSQL在查询时会从上表的每条记录并集中读取一条记录,当查询使用索引作为主键或全部唯一键时使用。 ref:仅当查询使用非唯一键或主键或这些类型的一部分(例如,使用最左边的前缀)时,才会出现此联接类型。 对于前一个表的每个行联合,将从表中读取所有记录。 这种类型在很大程度上取决于索引匹配的记录数量,越少越好。 range:此连接类型使用索引返回范围内的行,例如使用 > 或

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON