ヌル以外の列のカウントをwhere-partsのない1つのテーブルで使用すると、オプティマイザはそのテーブルの行数を返します。主キーのmariadb最適化が機能しない
PRIMARY KEYのように、UNIQE以外のNULL列のDISTINCT数を求める場合は、答えは同じである必要がありますが、今回はmariadbが計算を行います。
他のテーブルにjoinを残してもwhere-partsがない場合、結果はそのテーブルの行数になります。
mariadbがthous最適化を使用していない理由はありますか?大文字小文字が区別されない主キーのDISTINCTカウントが、そのテーブル内の行数に他の結果を与える可能性がありますか?
場合:JOINの主キー
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回PRIMARY KEYに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 WHERE-partsなしで
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 –
この場合、NULLでない一意の列にDISTINCTが必要な状況になるでしょうか?その結果は、その列の通常のカウントとどのように異なるでしょうか? – Mjh