MySQL查询主键上的慢查询表

Jon*_*Jon 4 mysql innodb

所以我有一个基本上像NoSQL设置一样使用的表.结构是:

id bigint主键数据mediumblob修改后的时间戳

它有大约350k行.在其上运行的查询的结构如下:

从表中选择数据,其中id = XXX;

表引擎是InnoDB.我注意到有时针对此表运行的查询相当慢.有时它们需要3秒才能运行.该表在磁盘上是3 GB,我给了innodb_buffer_pool_size 4G.

这里有什么我想念的吗?我可以调整任何设置以提高性能吗?

编辑:按要求解释输出:

+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table    | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | cache    | const | PRIMARY       | PRIMARY | 8       | const |    1 |       |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
Run Code Online (Sandbox Code Playgroud)

创建表:

CREATE TABLE `cache` (
  `id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `data` mediumblob,
  `modified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

IAm*_*rey 6

我最初在这里看到两个问题.首先,您有一个blob数据类型的查询.在数据检索方面,这将导致速度问题.其次,您正在使用InnoDB,它针对写入进行了优化.这意味着虽然它可能是整体上的最佳选择,但在极端阅读情况下,它可能不如MyISAM高.这些问题都不一定是交易杀手,但它们都会增加性能.然而,除此之外,我不确定如果没有先进行分析,我可以为您提供更好的答案,以便更好地进行优化.这就是我建议你先做的事情.描述您的查询以确定执行计划是什么,然后确定执行计划如此缓慢的原因.

这是一个很好的"十大"MySQL优化列表.至少有一对夫妇直接适用于您的情况:

http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/

这是另一个很好的优化文章,也进入了服务器设置(特别是InnoDB):

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

根据您提供的CREATE TABLE语句,我确实想到了您应该解决的另一件事(同样,不是查询杀手,而是另一个性能问题).除非存在为您的ID字段使用bigint的业务案例,否则请选择int.一个int将允许21亿行,所以你不应该用完数字.进行此切换将节省磁盘空间,并将提高查询性能.这是一篇关于它的文章:

http://ronaldbradford.com/blog/bigint-v-int-is-there-a-big-deal-2008-07-18/

  • innodb并不仅仅是为了写作而优化 - 一个设计良好的innodb表利用它的聚集索引将执行任何其他引擎http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-右一对-A/4421601#4421601 (2认同)