【发布时间】:2017-02-07 12:53:07
【问题描述】:
如果您对非空列使用计数,在一个表上,没有任何 where 部分,优化器只返回该表中的行数。
如果您要求对 UNIQE 非空列(如 PRIMARY KEY)进行 DISTINCT 计数,答案应该相同,但这次 mariadb 会进行 insted 计算。
如果您在其他表上留下了连接,但仍然没有 where-parts,则结果应该仍然是该表中的行数。
mariadb 是否有理由不使用 thou 优化?是否存在未过滤主键的 DISTINCT 计数可以给出任何其他结果而不是该表中的行数的情况?
案例:
CREATE TABLE products (
our_article_id varchar(50) CHARACTER SET utf8 NOT NULL,
...,
PRIMARY KEY(our_article_id)
);
CREATE TABLE product_article_id (
article_id varchar(255) COLLATE utf8_bin NOT NULL,
our_article_id varchar(50) CHARACTER SET utf8 NOT NULL,
...
PRIMARY KEY(article_id),
INDEX(our_article_id)
);
计数查询,第一次,基本计数
DESCRIBE SELECT COUNT(our_article_id) FROM products;
+------+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+------+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
主键上的第二个 DISTINCT
DESCRIBE SELECT COUNT(DISTINCT our_article_id) FROM products;
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE | products | index | NULL | PRIMARY | 152 | NULL | 225089 | Using index |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
第 3 个,主键上的 DISTINCT,以及没有 WHERE 部分的 LEFT JOIN
DESCRIBE SELECT COUNT(DISTINCT our_article_id) FROM products LEFT JOIN product_article_id USING (our_article_id);
+------+-------------+--------------------+-------+---------------+---------+---------+----------------------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------------------+-------+---------------+---------+---------+----------------------------------+--------+-------------+
| 1 | SIMPLE | products | index | NULL | PRIMARY | 152 | NULL | 225089 | Using index |
| 1 | SIMPLE | product_article_id | ref | PRIMARY | PRIMARY | 152 | testseek.products.our_article_id | 12579 | Using index |
+------+-------------+--------------------+-------+---------------+---------+---------+----------------------------------+--------+-------------+
【问题讨论】:
-
您没有在表定义中设置引擎。您使用的是 InnoDB 还是 MyISAM?
-
我的默认配置有:ENGINE=InnoDB
-
在哪种情况下,您需要对非空唯一列进行 DISTINCT 计数?该结果与该列的常规计数有何不同?
-
我认为@PugganSe 不是在问如何让他的查询更快,而是为什么 MariaDB / MySQL 查询规划器无法识别
COUNT(DISTINCT pk)总是与COUNT(*)具有相同的结果。这样做的设计原因是什么?好问题!