繁体   English   中英

'select * from ALargeTable' 在 MySQL 中执行速度非常慢

[英]'select * from ALargeTable' executes very slow in MySQL

我有一张“价格”表:

CREATE TABLE `prices` (
    `dt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `buy` double NOT NULL,
    `sell` double NOT NULL,
    PRIMARY KEY (`dt`),
    UNIQUE KEY `idx_dt_buy_sell` (`dt`,`buy`,`sell`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

大约有 2200 万行。

一个简单的查询

select * from prices;

执行大约需要 1 分钟。

MySQL 1 分钟做什么? 它构建了哪些数据结构? 有没有办法优化这个?

例如查询

select * from prices limit 10;

在 0.00 秒后立即执行。

我玩了一些事务隔离级别,命令如下

set SESSION transaction isolation level Read committed;
SELECT @@transaction_ISOLATION;

但没有成功。

MySQL 版本是 5.7.30

怎么了 ? MYSQL 服务器正在从您的磁盘读取数据,并将其加载到内存中(如果它尚未在内存中)并将数据发送到 MYSQL 客户端,该客户端将其存储在内存中,然后再将其提示给用户(您)。

它构建了哪些数据结构? 我不知道,但我不确定这是否真的很重要。

有没有办法优化这个? 是的,读取更少的数据,或者检查您的配置和硬件,(如果您有并发问题,您可能需要更改引擎)。

  • 读取更少的数据:如您所见, limit 10 ,查询运行速度很快,也许您不需要为每个查询返回 2200 万,您可以添加一个WHERE子句。
  • 检查您的硬件:数据在磁盘上,确保您有一个快速磁盘(如 SSD),同时确保服务器上有足够的内存
  • 检查您的配置:互联网上有更好的答案会解释如何调整您的配置,以简短(且不准确的方式)您希望所有数据都能够存储在内存中,如果您只是读取数据,我建议看看这个答案: https : key_buffer_size :如果还没有完成,增加您的key_buffer_size以匹配您的索引的大小,并一一尝试其他建议以查看如果任何或全部对您的表演产生影响
  • 关于并发:我的猜测是该表是只读的,如果您在查询时插入/更新数据,MyIsam 会进行表锁定,因此您可以尝试使用 InnoDB 来避免此表锁定

附带说明一下,正如@Barmar 所指出的,您正在同时测试服务器和客户端,并且您没有说明两者是否在同一台服务器上运行。 您很可能是这样,因此您的 MYSQL 服务器和 MYSQL 客户端可能会消耗内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM