簡體   English   中英

加快大表SQL查詢的方法

[英]Ways to speed up SQL query on large table

我有一個 1000 萬行和 3 列的 MySQL 表,格式如下:

id                                     time                               num

ca65e871-d758-437e-b76f-175234760e7b  2020-11-14T23:08:05.553770Z         11112222222
...

我正在嘗試計算特定數字和所需時間范圍內的出現次數,如下所示:

"SELECT COUNT(*) FROM TABLE_NAME WHERE time >'2020-11-14T23:08:05.553752Z' and num = '11112222222'"

我正在從 Python 環境(python 3.x)運行查詢,該環境使用pymysql包連接到 MySQL 數據庫。 在 10MM 行上,此執行持續大約2.8 秒 timenum列上添加索引后,執行速度幾乎是原來的兩倍: 1.5 秒

我的問題是我可以進一步加快速度嗎?

理想情況下,執行時間應該低於 200 毫秒,所以我不知道這是否可能。 先感謝您!

對於此查詢:

SELECT COUNT(*) 
FROM TABLE_NAME 
WHERE time > '2020-11-14T23:08:05.553752Z' AND num = '11112222222'

您需要(num, time)上的多列索引。 索引中列的順序很重要。 您首先需要具有等式謂詞的列,然后是具有不等式謂詞的列。

我對數據類型有點懷疑。 如果num是數字數據類型(它看起來像int ),那么您應該根據文字數字對其進行過濾:

num = 11112222222

進一步加快查詢速度的唯一方法是縮小數據類型。

num = '11112222222'不需要更改,但是...

BIGINT是 8 個字節。 如果您可以接受 40 億的限制,請使用INT UNSIGNED (4 字節)。

不幸的是,MySQL 無法將字符串'2020-11-14T23:08:05.553770Z'理解為DATETIME (也不是TIMESTAMP ) 如果time是 VARCHAR(27),則一切正常。 但是,如果您可以切換到兼容格式,那么DATETIME(6)將節省大量空間,它只有 8 個字節(而 varchar 為 28 個字節)。

由於其隨機性, UUIDs體積龐大且效率低下。 您可能正在使用CHAR(36) CHARACTER SET ascii -- 36 個字節。 將它(參見 MySQL 8.0)打包成 `BINARY(16) -- 16 個字節。

這些將顯着縮小表和索引,從而提供一些性能改進。

對於 UUID 的轉換代碼: http : //mysql.rjweb.org/doc.php/uuid#code_to_do_it MySQL 8.0 也有一對類似的內置函數。

此外, TZ不是DATETIME(6)有效字符,因此需要進行一些編輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM