MySQL查询慢查询主键上的表

标签 mysql innodb

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

id bigint 主键 数据介质 block 修改时间戳

它有大约 35 万行。在其上运行的查询的结构如下:

从表中选择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 |       |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+

创建表:

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

最佳答案

我最初在这里看到两个问题。首先是您有一个 blob 数据类型的查询。当涉及到数据检索时,这将导致速度问题。其次,您正在使用针对写入进行了优化的 InnoDB。这意味着虽然它可能是总体上最好的选择,但在极端读取情况下,它的性能可能不如 MyISAM。这些问题都不一定是交易 killer ,但它们都会增加性能损失。但是,除此之外,我不确定我能否给您一个很好的答案,说明您可以做些什么来更好地优化,而无需先进行分析。这就是我建议你首先做的。分析您的查询以找出执行计划是什么,然后确定执行计划为何如此缓慢。

这是一个很好的 MySQL 优化的“前 10 名”列表。至少有一对夫妇直接申请您的情况:

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 语句,我确实想到了您应该解决的另一件事(同样,这不是查询 killer ,但它是另一个性能损失)。除非有将 bigint 用于您的 ID 字段的业务案例,否则请选择 int。一个 int 将允许 21 亿行,所以你不应该用完数字。进行此切换将节省磁盘空间并提高查询性能。这是一篇关于它的文章:

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

关于MySQL查询慢查询主键上的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6209836/

相关文章:

mysql - 在 MySQL 中查找重复值

mysql - InnoDB 瓶颈 : Relaxing ACID to Improve Performance

javascript - nodejs mysql 无法执行查询

PHP/MySQL 农历

php - php 中的 mysqldump.exe

mysql 选择并联合所有

mysql - 如何在mysql中索引innodb文本?

MySQL 优化器 - 成本规划器不知道 DuplicateWeedout 策略何时创建磁盘表

php - 论坛帖子表应该使用 MyISAM 还是 InnoDB

mysql - 选择首先计数或数据以检查自动增量 ID