千家信息网

MYSQL explain详解之range

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,explain显示了MySQL如何使用索引来处理DML语句以及连接表,explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句2.EXPLAIN列的解释:table:显示这一行的数据是关于
千家信息网最后更新 2025年02月02日MYSQL explain详解之range

explain显示了MySQL如何使用索引来处理DML语句以及连接表,explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句

2.EXPLAIN列的解释:


table:显示这一行的数据是关于哪张表的


type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、 indexhe和ALL


possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句


key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引


key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好


ref:显示索引的哪一列被使用了,如果可能的话,是一个常数


rows:MYSQL认为必须检查的用来返回请求数据的行数


Extra:关于MYSQL如何解析查询的额外信息。坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢


3.Extra列返回的描述的意义:


Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了


Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了


Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一


Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行


Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候


Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上


Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)


system 表只有一行:system表。这是const连接类型的特殊情况


const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待


eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用


ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少-越少越好


range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况


index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)


ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免.


优化器中range的使用案例:

在寻求优化的时候需了解3点:

1、表的DDL

2、SQL语句

3、EXPLIAN

CREATE TABLE `account` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户资金账户',

`user_id` bigint(20) DEFAULT NULL COMMENT '用户ID',

`amount` decimal(10,2) DEFAULT '0.00' COMMENT '总金额',

`available` decimal(10,2) DEFAULT '0.00' COMMENT '可用余额',

`presented` decimal(10,2) DEFAULT '0.00' COMMENT '活动赠送金额',

`deposit_amount` decimal(10,2) DEFAULT '0.00' COMMENT '押金金额',

`freeze_amount` decimal(10,2) DEFAULT NULL COMMENT '冻结金额',

`status` tinyint(4) DEFAULT NULL COMMENT '账户状态',

`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`id`),

UNIQUE KEY `uid_index` (`user_id`) USING BTREE,

KEY `create_time` (`create_time`)

) ENGINE=InnoDB AUTO_INCREMENT=6184535 DEFAULT CHARSET=utf8

#######

EXPLAIN SELECT * FROM account WHERE id>1

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE account range PRIMARY PRIMARY 8 2808936 Using where

看起来好像走了RANGE......

EXPLAIN SELECT * FROM account WHERE user_id>1

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE account ALL uid_index 5617872 Using where

这里出问题了吧.....

EXPLAIN SELECT * FROM account WHERE user_id>1 AND user_id<2222

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE account range uid_index uid_index 9 2218 Using index condition

#第一个看起来是走了range,实际是因为primary key 起决定性因素

在第2个有索引但全表扫描,只有开区间没有

在第3个包含了开区间和闭区间直接走了range

由此:在SQL优化时候,如果要使用range来实现索引,必须满足有开始点和结束点,俗称开区间和闭区间。

比如在时间字段上添加2级索引,如:

SELECT * FROM account WHERE create_time>DATE_FORMAT("2017-01-26",'%Y-%m-%d') AND create_time

SELECT * FROM account WHERE create_time>DATE("2017-01-26")AND create_time

SELECT * FROM account WHERE create_time>STR_TO_DATE("2017-01-26",'%Y-%m-%d')AND create_time

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE account range create_time create_time 6 129610 Using index condition

一般WHERE条件里包含函数是不能走索引的,前提是不靠近WHERE时候就能生效


索引 类型 查询 时候 语句 情况 联合 只有 实际 数据 金额 排序 一行 信息 常数 时间 用户 这是 开区 选择 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 查数据库连接数 合金相图数据库为啥没有三维 blackwell数据库 软件开发中的功能如何计费 北京安防守时模块服务器虚拟主机 游戏软件开发应该 杭州信息化网络技术有哪些 wifi服务器红灯亮怎么办 网络安全密码多久需要更换 解压数据库要不要网络 计算机网络安全论文研究方法 洛阳西美网络技术服务部 在客户的服务器项目独立部署 大华网络视频服务器常响 软件开发营销app 蛋白乙酰化数据库 计算机网络技术专科 tbc换服务器注意事项 公安网络安全培训会简报 零信任模式保网络安全 棱镜门事件网络安全的重要性 互联网高科技有限公司怎么样 贵州广思网络技术有限公司 电脑打印机服务器脱机怎么解决 车载网络技术应用的作用 fm19载入自定义数据库 顺丰快递服务器机房空调着火 销售部门管理系统数据库 国外高校网络安全的研究现状 基建网络安全管理
0