[英]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 秒。 在time
和num
列上添加索引后,執行速度幾乎是原來的兩倍: 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 也有一對類似的內置函數。
此外, T
和Z
不是DATETIME(6)
有效字符,因此需要進行一些編輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.