我的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秒,是什么原因造成的呢?
答案 0 :(得分:3)
如果将值置于引号,则服务器将使用索引,如果没有引号,即WHERE子句中传递的整数值,则索引将不起作用。
您认为123456
将转换为varchar
,然后索引必须有效。不。 integer
高于varchar
的优先级,然后所有CID
值都将转换为integer
进行比较,并且您有表扫描。< / p>
答案 1 :(得分:0)
CID的类型很重要。如果要正确使用索引,则应使用正确的类型构建查询在您的情况下,CID是varchar。因此,您应该在引号中给出一个值。否则它将被转换为整数,这需要很多时间。