我试图用它log_queries_not_using_indexes = 1
来查找在 MySQL 服务器上没有以最佳方式执行的查询。但是,我发现生成的日志文件的价值相当有限。显然,只要优化器真的决定不在 WHERE 子句中使用索引作为标准,就会记录查询。如果它们确实没有与过滤列匹配的索引,则不会。
所以给定一个具有以下结构的表
CREATE TABLE `test` (
`id_test` int(11) NOT NULL AUTO_INCREMENT,
`some_text` varchar(255) DEFAULT NULL,
`some_more_text` text,
PRIMARY KEY (`id_test`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
由于不使用索引,查询SELECT id_test from test where id_test != 69
将被记录到慢速日志中(优化器已决定表扫描更有效,因为使用索引不会赢得太多)但SELECT id_test from test where id_test = 69
不会。
由于索引存在,我希望后一种查询的行为在第一种情况下也是如此。照原样,它使故障排除丢失的索引相当烦人。关于如何解决这个问题的想法非常感谢。
我不太确定您为什么不希望
log_queries_not_using_indexes=1
记录不使用索引的查询。设置的想法是查看哪些查询正在您的服务器上运行,这些查询可能是优化的理想候选者。对于您的示例:除非您更改查询的要求,否则您无能为力。
id_test
当然,进行完全扫描并返回所有与该值不匹配的行会更快。至于如何进行分析的想法:
您可以设置
min_examined_row_limit
为更高的值。例如,如果您想排除检查少于 5,000 行的查询,请将此变量设置为 5000。这有助于减少慢查询日志中的“噪音”。您可以使用一个名为选项的工具
pt-query-digest
来--review
查看您的慢查询。该工具允许您存储您的审查历史记录,这样您就不会在分析过程中重复对同一查询的工作:它还具有存储在慢查询中记录的查询历史记录的额外好处。谁不喜欢改进查询的历史证据?