Wenn Sie eine Zählung für eine Nicht-Null-Spalte in einer Tabelle ohne Where-Teile verwenden, gibt der Optimaizer nur die Anzahl der Zeilen in dieser Tabelle zurück.Mariadb-Optimierung des Primärschlüssels funktioniert nicht
Wenn Sie nach einer DISTINCT-Zählung auf einer UNIQE-Nicht-Null-Spalte, wie dem PRIMARY KEY, fragen, sollten die Antworten identisch sein, aber dieses Mal führt Mariadb die Berechnungen aus.
Und wenn Sie Join auf anderen Tabellen verlassen haben und noch keine Where-Teile, sollten die Ergebnisse immer noch die Anzahl der Zeilen in dieser Tabelle sein.
Gibt es einen Grund dafür, dass Mariadb keine Tausender-Optimierungen verwendet? Gibt es einen Fall, wenn die DISTINCT-Zählung eines ungefilterten Primärschlüssels irgendein anderes Ergebnis als die Anzahl der Zeilen in dieser Tabelle ergibt?
Fall:
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)
);
Count-Abfragen, 1., Grundzahl
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 |
+------+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
2. DISTINCT auf Primärschlüssel
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 auf PRIMARY KEY und eine LEFT JOIN ohne WO-Teile
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 |
+------+-------------+--------------------+-------+---------------+---------+---------+----------------------------------+--------+-------------+
Sie legen in der Tabellendefinition keine Engine fest. Verwenden Sie InnoDB oder MyISAM? –
meine Standardkonfiguration habe: ENGINE = InnoDB –
In welchem Fall würden Sie in einer Situation sein, in der Sie DISTINCT Count auf einer nicht null eindeutigen Spalte benötigen? Wie würde dieses Ergebnis von einer normalen Anzahl in dieser Spalte abweichen? – Mjh