0

我的 MySQL 5.1.66 上有以下数据库结构:

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)

我在数据库中有近 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 回答