如果您在一個表上使用非空列的計數,但沒有任何where-parts,optimaizer只會返回該表中的行數。主鍵無效的mariadb優化
如果你要求UNIQE非空列的DISTINCT計數,如PRIMARY KEY,答案應該是相同的,但是這次mariadb做了insted的計算。
如果您在其他表上留下了連接,並且仍然沒有where-parts,那麼結果仍應該是該表中的行數。
mariadb是否有沒有使用這些優化的原因?有沒有情況下,未經過濾的主鍵的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)
);
計數查詢,1,基本合計
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上PRIMARY KEY和LEFT JOIN沒有WHERE部分
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計算非空的唯一列?該結果與該列的正常計數有何不同? – Mjh