1

次のクエリを使用して、mediumblob列から頻繁に短い値を抽出しています。

select bytes, count(*) as n
from pr_value
where bytes is not null && length(bytes)<11 and variable_id=5783
group by bytes order by n desc limit 10;

私が抱えている問題は、このクエリに時間がかかりすぎることです(100万未満のレコードで約10秒):

mysql> select bytes, count(*) as n from pr_value where bytes is not null && length(bytes)<11 and variable_id=5783 group by bytes order by n desc limit 10;
+-------+----+
| bytes | n  |
+-------+----+
| 32    | 21 |
| 27    | 20 |
| 52    | 20 |
| 23    | 19 |
| 25    | 19 |
| 26    | 19 |
| 28    | 19 |
| 29    | 19 |
| 30    | 19 |
| 31    | 19 |
+-------+----+

表は次のとおりです (無関係な列は示されていません)。

mysql> describe pr_value;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| product_id  | int(11)       | NO   | PRI | NULL    |       |
| variable_id | int(11)       | NO   | PRI | NULL    |       |
| author_id   | int(11)       | NO   | PRI | NULL    |       |
| bytes       | mediumblob    | YES  | MUL | NULL    |       |
+-------------+---------------+------+-----+---------+-------+

ほとんどの値が大きいため、タイプは mediumblob です。この特定のクエリで探しているものと同じように短いのは 10% 未満です。

私は次のインデックスを持っています:

mysql> show index from pr_value;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| pr_value |          0 | PRIMARY  |            1 | product_id  | A         |        8961 |     NULL | NULL   |      | BTREE      |         |               |
| pr_value |          0 | PRIMARY  |            2 | variable_id | A         |      842402 |     NULL | NULL   |      | BTREE      |         |               |
| pr_value |          0 | PRIMARY  |            3 | author_id   | A         |      842402 |     NULL | NULL   |      | BTREE      |         |               |
| pr_value |          1 | bytes    |            1 | bytes       | A         |      842402 |       10 | NULL   | YES  | BTREE      |         |               |
| pr_value |          1 | bytes    |            2 | variable_id | A         |      842402 |     NULL | NULL   |      | BTREE      |         |               |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

MySQLは私のクエリを次のように説明しています:

mysql> explain select bytes, count(*) as n from pr_value where bytes is not null && length(bytes)<11 and variable_id=5783 group by bytes order by n desc limit 10; 
+----+-------------+----------+-------+---------------+-------+---------+------+--------+----------------------------------------------+
| id | select_type | table    | type  | possible_keys | key   | key_len | ref  | rows   | Extra                                        |
+----+-------------+----------+-------+---------------+-------+---------+------+--------+----------------------------------------------+
|  1 | SIMPLE      | pr_value | range | bytes         | bytes | 13      | NULL | 421201 | Using where; Using temporary; Using filesort |
+----+-------------+----------+-------+---------------+-------+---------+------+--------+----------------------------------------------+

期間を変更せずにバイト列の長さに関する条件を削除できることに注意してください。

このクエリを高速化するにはどうすればよいですか?

もちろん、列を追加する必要はありません。

4

2 に答える 2

2

(bytes, variable_id) のインデックスはあまりスマートではありません。クエリに常に variable_id 句がある場合は、最初に variable_id でインデックスを追加する必要があります。

(variable_id, bytes)

variable_id がどの程度判別できるかによって異なります。しかし、それは助けになるでしょう。

もう 1 つのヒントは、結果が "length(bytes)<11" の新しいインデックス付き列を追加することです。

update pr_value set small = length(bytes)<11;

(small,variable_id) で新しいインデックスを追加します。

于 2012-07-03T13:17:46.017 に答える
1

なぜblob列をGROUPBYするのですか?これがボトルネックだと思います。クエリは実際にすべてのblob列を相互に比較します。BLOBに一意の値が必要なためですか?DISTINCTキーワードは、GROUPBYよりもパフォーマンスが優れていると思います。

于 2012-07-03T13:10:54.343 に答える