我正在使用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
请非常感谢任何建议或指南。
答案 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)
如果Serial
为VARCHAR
,则表示您遇到了输入问题。在" 123456"。
PARTITION
无法帮助查询。
如果您需要进一步讨论,请提供SHOW CREATE TABLE
。