0

MySQL5.1.66には次のDB構造があります。

ID         int(11) PRIMARY
CID        varchar(255) INDEX
V1         varchar(1500)
DATE       datetime
IP_ADDR    varchar(255)
V2         varchar(1000)
USER_DELAY int(11)
M_ID       int(22)
REFERER    varchar(255)
BRAND      varchar(255)
LANG       varchar(255)
USER       varchar(255)

DBには約9,000,000行ありますが、これが私のより重要なmy.cnfプロパティの一部です。

innodb_buffer_pool_size = 256M
innodb_log_buffer_size = 16M
key_buffer_size = 128M
bulk_insert_buffer_size = 128M
max_heap_table_size = 128M
sort_buffer_size = 8M
tmp_table_size = 128M

問題は、次のような単純なクエリを実行する場合です。

SELECT * FROM table WHERE CID = 123456

応答を取得するのに60秒以上かかります(CIDはインデックス付きフィールドであり、クエリの結果は10個のみです)。

上記のクエリのEXPLAIN出力:

+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | table | ALL  | CID           | NULL | NULL    | NULL | 9193357 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+

編集:何かに気づきました。値を引用符で囲むと、0.13秒で結果が得られますが、引用符なしでクエリを実行すると60秒かかります。これは何が原因ですか?

4

2 に答える 2

3

値を引用符の下に配置すると、引用符がない場合、つまりWHERE句で整数値が渡され、インデックスが機能しない場合、サーバーはインデックスを使用します。123456に変換されvarchar、インデックスが機能する必要があると思います。いいえ。それより高い値の優先順位はintegervarcharCID、比較するために変換されinteger、テーブルスキャンが実行されます。

于 2013-01-27T21:06:48.783 に答える
0

CIDのタイプは重要です。インデックスを正しく使用する場合は、正しいタイプでクエリを作成する必要があります。この場合、CIDはvarcharです。したがって、値を引用符で囲むことが期待されます。それ以外の場合は、多くの時間がかかる整数に変換されます。

于 2013-01-27T21:56:22.413 に答える