繁体   English   中英

MySQL InnoDB性能问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM