2014-02-25 111 views
2

的Mysql的5.1.xMySQL为什么记录为缓慢的查询/日志查询不使用索引时有索引?

在my.cnf:

log-queries-not-using-indexes = 1 
long_query_time = 30 
and slow queries are logged 

我为什么显示这个在日志?不慢,所有字段都编入索引。

从mysql.slow.log:

# Query_time: 0.001492 Lock_time: 0.000031 Rows_sent: 229 Rows_examined: 458 
use database1; 
SET timestamp=1393342939; 
SELECT id,name FROM database1 ORDER BY name ASC; 

这个表有229行,MYISAM。

id and name are indexed 
id = auto increment int unsigned 
name = varchar(255) utf-8 

你能解释为什么我在非索引/慢查询日志中显示这个吗?

摘要和详细信息:

MyISAM表,229行,多列,但所有的,通过ID和名称列需要229。两者都有索引。在查询时需要显示所有229行。

我想两两件事:

  • 1:不要显示在查询慢查询/不被使用的索引数。
  • 2 .: 尽可能快地进行查询。

谢谢。

+1

“为什么我在非索引/慢查询日志中显示” - 慢查询日志不是关于不使用索引的查询,而是关于执行缓慢的查询。 PS:对于给定的查询和数据集大小,我没有看到任何可用的索引。 – zerkms

+0

查询时间比配置中少3000倍。这很奇怪。 –

回答

2

由于您没有要索引的WHERE谓词,因此您正在对表进行字面全面扫描。

+0

如果我添加到这个查询:SELECT id,name FROM database1 WHERE id> 0 ORDER BY name ASC; //会好的,而不是在这个日志中?我会尝试一下......从表格中获取所有数据并获得最快速度的最佳方式是什么?就像我从数据库的10个县名中得到10个,例如... –

+1

不!索引的总体思想是能够更快地找到表的一个子集,而无需评估给定条件数量的每一行。 id> 0,假设id总是正数,也会给你一个完整的扫描(因为你在概念上拉动表中的每条记录)。在这样的查询中没有优化可以做,我怀疑你可以得到少于1.5ms的执行。 – dElo

+1

例如,如果您在该表中有100行,并且想要将id = 1的那个索引引用,那么索引就会有意义。此时,您需要在id字段上创建和编制索引,而您的EXPLAIN PLAN将反映索引的用法。 – dElo