[英]MySQL InnoDB performance issues
我在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秒,这是什么原因引起的?
如果将值放在引号下,则如果没有引号,则服务器将使用索引,即WHERE子句中传递的整数值和索引将不起作用。 您认为123456
将被转换为varchar
,然后索引必须工作。 否。 integer
的优先级高于varchar
则所有CID
值都将转换为integer
以进行比较,并且您具有表扫描功能。
CID的类型很重要。 如果要正确使用索引,则应使用正确的类型构建查询。在这种情况下,CID为varchar。 因此,期望您提供一个用引号引起来的值。 否则,它将被转换为需要很多时间的整数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.