一 id
查询的标识符。若有子查询,则每个查询都有唯一的 ID。
二 select_type
zh | ch |
---|---|
简单查询 | SIMPLE |
主查询 | PRIMARY |
子查询 | SUBQUERY |
三 table
表名,表示正在访问哪张表。
四 partitions
定义:显示查询访问的表的分区名。如果表没有分区,该字段通常为NULL。
用途:分区可以提高查询性能,尤其是在处理大数据集时。它允许数据库按特定字段将表划分为多个部分,使得查询时只需访问相关的分区而不是整个表。
4.1 mysql分区实现
在 MySQL 中,表分区可以通过分区表的功能来实现。以下是实现表分区的步骤和示例:
4.1.1 创建分区表
在创建表时,可以指定分区方案。常见的分区类型包括:
RANGE:基于连续的值划分分区。
LIST:基于特定的值列表划分。
HASH:基于哈希函数生成的值。
KEY:使用 MySQL 内部的哈希函数。
示例:使用 RANGE 分区
CREATE TABLE sales (
id INT,
sale_date DATE,
amount DECIMAL(10, 2),
PRIMARY KEY (id, sale_date)
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024)
);
4.1.2 向分区表中插入数据
插入数据时,MySQL 会根据定义的分区自动将数据放入相应的分区。
INSERT INTO sales (id, sale_date, amount) VALUES
(1, '2021-06-15', 100.00),
(2, '2022-07-20', 150.00),
(3, '2023-01-05', 200.00);
4.1.3 查询分区表
查询时,MySQL 会根据条件只访问相关的分区,从而提高查询效率。
SELECT * FROM sales WHERE sale_date BETWEEN '2022-01-01' AND '2022-12-31';
4.1.4 修改分区
可以使用 ALTER TABLE 语句添加、删除或修改分区。
示例:添加新分区
ALTER TABLE sales ADD PARTITION (
PARTITION p2024 VALUES LESS THAN (2025)
);
五 type
zh | ch |
---|---|
system | 表只有一行 |
const | 表中有常量的条件,最多只返回一行 |
eq_ref | 每个行的数据只返回一行 |
ref | 非唯一索引,返回匹配的行 |
range | 范围扫描,使用了索引 |
index | 全索引扫描 |
ALL | 全表扫描,最不优 |
eq_ref 定义
每个行的数据只返回一行:意味着对于每一行来自左表(或主表)的数据,右表(或副表)只会返回一行匹配记录。这种连接方式通常发生在使用主键或唯一索引进行查找时。
何时使用 eq_ref
条件:当你对两个表进行 JOIN 时,如果右表的连接条件使用了主键或唯一索引,MySQL 会使用 eq_ref 进行访问。
性能:eq_ref 是访问方式中最有效的之一,因为它取决于索引,只查找特定的行,不进行全表扫描。
示例
假设有两个表:orders(order_id 是主键)和 customers(customer_id 是主键)。
SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;
在这个查询中,如果 customer_id 在 customers 表中是主键,EXPLAIN 的输出可能显示 type 为 eq_ref,表示对 customers 表的访问使用了主键索引,并且对于每个 orders 表的行,只会返回 customers 表中匹配的一行。
六 possible_keys
显示可能用于查询的索引
七 key
实际使用的索引
八 key_len
用的索引长度,表示执行是利用的索引的字节数。
九 ref
显示哪个列或常量与索引结合使用。
十 rows
表示估计访问的行数
十一 filtered
定义:这个值表示在查询过程中,经过条件筛选后,实际满足条件的行的比例。
范围:通常是一个百分比,表示将要处理的行中有多少比例最终会被实际返回。
示例:如果 filtered 值为 50,意味着在扫描的行中,有 50% 的行会被查询返回。
性能优化:较低的 filtered 值可能表示需要对查询条件进行优化,以减少不必要的数据处理。
查询分析:通过查看 filtered 值,可以判断条件选择是否有效,是否需要添加索引来提高效率。
十二 Extra
额外的信息,如使用的附加操作,如 Using where(使用 WHERE 子句过滤),Using index(仅使用索引)等