我有一个包含 700000 行和 400 列的表,其中列 ID 已编入索引,其他列是动态的。
当我只是给予
select * from table
需要超过 4 分钟。表与 myisam 引擎一起使用,我尝试增加 key_buffer_size
但没有太大帮助。我可以优化哪些其他参数以使其更快
最佳答案
运行查询的最大问题就是简单地填充响应。无论表下的潜在效率如何,即使有数据的字段很少,表中的每一行都会返回 400 个单元格的记录 - 因此,您必须在 4 秒内发送 280M 个单元格分钟,这意味着大约 100 万个单元格/秒。
key_buffer_size 什么都不做,因为您只是流式传输您的表 (.MYD) 文件,该文件未缓存在 key 缓存中,并且仅缓存在操作系统缓冲区中。
所以,如果你想让它更快,你可能想要:
- 通过不阅读 * 来减少您阅读的列数,而是指定单独的列
- 减少表格中的列数
- 阅读更少的行
如果您不想要上述任何一种,并且希望您的工作量更快,则必须并行进行读取。
如果您通常不按列的值进行过滤/索引,则可以将它们放在以任何其他方式(Thrift、Protobufs、JSON 等)打包的 BLOB 字段中,这样读取数据不会导致疯狂的协议(protocol)开销,你将能够更快地阅读你的表格。
关于mysql减少了选择查询所花费的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48194259/