簡體   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