mysql - 为什么 EXPLAIN 的输出在每个 SHOW 索引后都会改变?

标签 mysql sql indexing explain

我试图通过使用 EXPLAIN 的索引来提高某些查询的性能我注意到每次使用 SHOW index FROM TableB; 查询的 EXPLAINrows 列的输出都发生了变化

例如:

mysql> EXPLAIN Select A.id
     From TableA A
     Inner join TableB B
         On A.address = B.address And A.code = B.code
     Group by A.id
     Having count(distinct B.id) = 1;
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                                   | rows  | Extra                                        |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | B     | index  | test_index    | PRIMARY | 518     | NULL                                  | 10561 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | A     | eq_ref | PRIMARY       | PRIMARY | 514     | db.B.address,db.B.code                |     1 |                                              |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+----------------------------------------------+
2 rows in set (0.00 sec)

mysql> show index from TableB;
+-----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| TableB    |          0 | PRIMARY      |            1 | id          | A         |           7 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          0 | PRIMARY      |            2 | address     | A         |          21 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          0 | PRIMARY      |            3 | code        | A         |       10402 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          1 | test_index   |            1 | address     | A         |           1 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          1 | test_index   |            2 | code        | A         |       10402 |     NULL | NULL   |      | BTREE      |         |
| TableB    |          1 | test_index   |            3 | id          | A         |       10402 |     NULL | NULL   |      | BTREE      |         |
+-----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
6 rows in set (0.03 sec)

和...

mysql> EXPLAIN Select A.id
        From TableA A
        Inner join TableB B
           On A.address = B.address And A.code = B.code Group by A.id
        Having count(distinct B.id) = 1;
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                                   | rows  | Extra                                        |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | B     | index  | test_index    | PRIMARY | 518     | NULL                                  | 9800  | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | A     | eq_ref | PRIMARY       | PRIMARY | 514     | db.B.address,db.B.code                |     1 |                                              |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+----------------------------------------------+
2 rows in set (0.00 sec)

为什么会这样?

最佳答案

rows 列应仅作为粗略估计。这不是一个精确的数字。

它基于对查询期间将检查的行数的统计估计。在实际执行查询之前,无法知道实际的行数。

统计数据基于定期从表中读取的样本。偶尔会重新读取这些示例,例如在您运行 ANALYZE TABLE 或某些 INFORMATION_SCHEMA 查询或某些 SHOW 语句之后。

关于mysql - 为什么 EXPLAIN 的输出在每个 SHOW 索引后都会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41190270/

相关文章:

jquery - 使用JSON从MYSQL获取数据到Java

python - python调用存储过程时字符串值不正确警告

mysql - 如果 id 更改,SQL 重置变量值

Java SQL 语句问题

mysql错误: an alias was previously found

sql - 具有多个外部应用行的大型表比较性能

sql - 当我在 SQL 中输入日期值时,为什么会得到 "type mismatch"?

jQuery - 悬停时将样式应用于表中的所有垂直 TD

Oracle索引-全表扫描/锁定

mysql - Mysql中的Primary、Unique和Index