MySQL InnoDB性能问题

时间:2013-01-27 20:39:01

标签: mysql innodb

我的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)

我在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秒,是什么原因造成的呢?

2 个答案:

答案 0 :(得分:3)

如果将值置于引号,则服务器将使用索引,如果没有引号,即WHERE子句中传递的整数值,则索引将不起作用。 您认为123456将转换为varchar,然后索引必须有效。不。 integer高于varchar 的优先级,然后所有CID值都将转换为integer进行比较,并且您有表扫描。< / p>

答案 1 :(得分:0)

CID的类型很重要。如果要正确使用索引,则应使用正确的类型构建查询在您的情况下,CID是varchar。因此,您应该在引号中给出一个值。否则它将被转换为整数,这需要很多时间。