我试图对不同列上的不同查询做一些基准测试,但MySQL就是不允许我这样做。在第一次执行查询之后,我再也无法获得该查询的相同执行时间。例如,如果第一次在0.062秒内执行查询,则在第二、第三和第三次运行时,我将永远无法获得相同的执行时间。要么是0秒钟,要么是0.015左右。
我读过许多关于禁用和清除MySQL查询缓存的文章,但它们对我没有任何帮助。
不管我做什么,MySQL似乎坚持使用缓存的结果。
我重新启动MySQL工作台,然后运行;
set global query_cache_type=0;
set global query_cache_size=0;
flush query cache;
reset query cache;执行时间一直显示为0秒。
只有我无法更改的服务器变量是"have_query_cache“。它的价值是“是的”,当我试图将它设置为"no“时,Workbench说它是只读的。
我也是这样;
set profiling=1;
run my select query
show profile for query 2;分析结果表明:
'starting', '0.000077'
'checking permissions', '0.000007'
'Opening tables', '0.000016'
'init', '0.000035'
'System lock', '0.000009'
'optimizing', '0.000013'
'statistics', '0.000094'
'preparing', '0.000008'
'executing', '0.000002'
'Sending data', '0.000016'
'end', '0.000002'
'query end', '0.000003'
'closing tables', '0.000005'
'freeing items', '0.000139'
'cleaning up', '0.000009'如果我没有错,这表明没有缓存被使用,对吗?但我还是看到了0秒。执行的时间。
编辑:我正在运行的查询是使用"SQL_NO_CACHE“的SELECT查询,如下所示:
SELECT SQL_NO_CACHE col1,now() from mytable where col2="some_value"(我添加了now()函数,以帮助我防止查询缓存)
Edit2:我在使用innoDB,MySQL 5.6.10
有人能帮帮我吗因为我看不清这是怎么回事。
非常感谢!
发布于 2013-04-16 18:07:49
第一次运行查询会使InnoDB缓冲池填充表的相关块。
因为重新运行查询需要完全相同的块,所以它避免了在重新运行时需要从磁盘读取查询,从而大大加快了查询的速度。
发布于 2013-04-16 18:06:44
这可能是由于数据本身的缓存,而不是查询缓存。
为了确保可以禁用单个语句的查询缓存,可以在SQL_NO_CACHE语句之后添加选择语句。
例如:
SELECT SQL_NO_CACHE field FROM table.
发布于 2013-04-17 00:11:23
您可以验证缓冲池页面读取与必须进入磁盘才能获得该页的页读取之间的区别:
mysql> SHOW SESSION STATUS LIKE 'Innodb_buffer_pool_read%';
mysql> ...run a query...
mysql> SHOW SESSION STATUS LIKE 'Innodb_buffer_pool_read%';比较报告中的这些值,并注意它们增长了多少:
+---------------------------------------+----------+
| Variable_name | Value |
+---------------------------------------+----------+
| Innodb_buffer_pool_read_requests | 10327490 |
| Innodb_buffer_pool_reads | 1133 |
+---------------------------------------+----------+read_requests是逻辑页读取,它可以从缓冲池中已经存在的页面读取。如果这个数字在查询之后增长,但读取却没有增长,那么您的查询只从缓冲池中获得其结果。
reads 是必须输出到磁盘并导致I/O将页复制到缓冲池中的页面读取的数量。如果这个数字在查询后增加,那么它必须从磁盘加载数据。
有关内存访问与磁盘访问之间性能差异的更多信息,请阅读http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/。
关于你的评论:
“打开表”与InnoDB表的内存缓存相关,有点像数据字典。表在重新启动后第一次被引用时会被打开。给定表在内存中的数据字典中的条目将无限期地留在内存中,因此,如果您有数千个表,那么内存使用量就会增长得相当大。在MySQL 5.6中,它们有一些ne调优变量来限制内存的使用,并将很少使用的表排除在外。但是整个机制与缓冲池是分开的,缓冲池存储数据和索引页。
“统计数据”也与缓冲池分离。InnoDB维护有关数据和索引的内存中统计信息,用于指导查询优化器。当您第一次访问InnoDB表、运行显示表状态或对INFORMATION_SCHEMA运行某些查询时、运行分析表时以及当表大小发生显著变化时,统计信息都会自动刷新。InnoDB生成这些统计数据,随机从表中读取固定数量的页面,如果您有一个冷缓冲池,这很可能会击中磁盘。
https://stackoverflow.com/questions/16043943
复制相似问题