我有大约50个MySQL数据库,每个数据库都有超过20个表。我的Sort_rows,handler_read_rnd_next和handler_read_first的数据都很高。
如果没有必要,我不能手动为每个表添加索引,而且可能会遗漏一些索引,因此我正在寻找一个工具或一个配置,它可以帮助我找到哪些行/请求缺少索引。
您正在使用哪些工具,或者如何配置MySQL来告诉我有关这些非索引查询的更多信息?
发布于 2017-02-23 14:21:03
要查找所有不使用索引的查询,您需要做两件事:
在my.cnf for 5.6中,如下所示:
[mysqld]
...
...
slow_query_log=ON
log_queries_not_using_indexes=ON这两个变量都是动态变量,可以在这样的运行系统上设置:
mysql> SET GLOBAL slow_query_log=ON;
mysql> SET GLOBAL log_queries_not_using_indexes=ON;有关详细信息,请参阅https://dev.mysql.com/doc/refman/5.6/en/slow-query-log.html,并注意,默认情况下,不使用索引的查询不会记录到慢速查询日志中,但是如果启用了log_queries_not_using_indexes,则所有不使用索引的查询都将被记录下来,而不管它们执行的时间是否超过“long_query_time”。如果记录的查询数量过多,请使用log_throttle_queries_not_using_indexes限制不使用每分钟将记录的索引的查询数。与其他两个全局变量一样,这是动态的,可以在这样的运行系统上进行更改,例如将其设置为每分钟10次:
mysql> SET GLOBAL log_throttle_queries_not_using_indexes=10;这应该能让你振作起来。
发布于 2017-02-24 00:59:36
long_query_time=1;打开慢速日志(如果可能的话)到FILE;等待一天或更长时间;使用pt-query-digest总结结果。
“最差”查询将首先在输出中排序(默认情况下)。做好前几个。
定期重复。
我不喜欢log_queries_not_using_indexes=ON --它只是把慢速日志中的小表格弄乱了,不管是否使用索引都不重要。此外,有时优化器会故意地、正确地避开所有索引并进行表扫描。
我说没有办法自动生成索引。毕竟,有时“综合”指数是“正确”的答案。有时,重新制定查询比索引所能做的任何事情都要好。有时,模式更改是最好的操作。有时(现在很少),一些VARIABLE会有所帮助。有时,改进需要对应用程序进行更改。
Handler%条目在SESSION STATUS中很方便,但我仅限于将查询的一种形式与另一种形式进行比较。它非常擅长于说,即使是对于小型表,哪个查询的扩展性也会更好。
如果你有任何很难改进的问题,发布一个新的问题。包括SHOW CREATE TABLE和EXPLAIN SELECT ...
也见我的索引食谱。其中包括了许多DBA不太理想的东西--许多DBA的CREATE TABLE:许多映射表。这是一个AUTO_INCREMENT PRIMARY KEY损害性能的例子。
(我做这类事情已经有十多年了。)
发布于 2017-02-23 12:08:48
我敢肯定这个问题已经问过很多次了
JetProfiler和MONyog允许集中处理最重要的查询、按数据库进行排序加载、总时间、总数、锁定时间等,保存数据以进行特性分析和比较。
https://dba.stackexchange.com/questions/165289
复制相似问题