MySql,SELECT * FROM with Indexed columns

时间:2015-11-12 12:40:42

标签: mysql sql database performance indexing

我正在使用MySql中的一个表,该表具有名为" serial"的int索引列。该表有大约200万行。

如果我以这种方式对此列应用select语句:

 SELECT serial FROM Table WHERE Serial=12345

这将返回< 1秒。

但是,如果我在同一个表中使用SELECT *查询,则此查询需要大约78秒 ...

我知道将索引应用于表中的所有列是没有用的,如果我需要获取特定序列中的所有列,如何优化/最小化查询响应时间?

 SELECT * FROM Table WHERE serial= 12345

EXPLAIN的结果:

SELECT serial:

  

1 SIMPLE tableName index idx_tablename_serial 5 6686620使用索引

SELECT *:

  

1 SIMPLE agsensepivotreadings ALL(null values)6686620

请非常感谢任何建议或指南。

4 个答案:

答案 0 :(得分:1)

甚至限制一些人需要阅读的列数也会有所帮助。只是限制它更多,IF索引更多列有助于继续,但它们需要在WHERE子句中使用。

答案 1 :(得分:1)

评论太长了。

列不太可能导致问题。如果一列(或多列)真的是非常大的对象,就会发生这种情况。要达到78秒,您需要考虑许多兆字节或千兆字节,尽管在许多环境中即使1 GB也不会花费那么长时间。

使用索引与非索引很容易解释。第一个查询由索引覆盖,因此不需要原始数据页。索引不包含第二个查询。因为选择了这么多行,所以可能需要读取所有数据,以便找到匹配的行。这是防止颠簸的优化。它可以解释发生了什么,虽然将表加载到内存中78秒似乎很长时间 - 除非行非常宽。

另一种可能性是其他操作锁定表。在许多环境中,这可能是最有可能的罪魁祸首。

最后,如果查询略有不同(例如一个order by或常量用单引号括起来),那么这可能会产生一些差异。

我会检查explain以查看发生了什么。即使搜索几百万行的表也不需要78秒。

答案 2 :(得分:1)

您的问题有部分答案。

https://stackoverflow.com/a/3211164/2957840

但是,也许你应该考虑对你的表进行分区: https://dev.mysql.com/doc/refman/5.7/en/partitioning.html

答案 3 :(得分:0)

如果SerialVARCHAR,则表示您遇到了输入问题。在" 123456"。

周围加上引号

PARTITION无法帮助查询。

如果您需要进一步讨论,请提供SHOW CREATE TABLE