所以我有一个基本上像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)
我最初在这里看到两个问题.首先,您有一个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/
| 归档时间: |
|
| 查看次数: |
6001 次 |
| 最近记录: |