簡體   English   中英

簡單的 SQL 查詢不使用帶有 order 子句和更大限制的索引 MariaDB

[英]Simple SQL query not using index with order clause and larger limit MariaDB

我剛剛遇到數據庫在選擇大量數據時沒有考慮索引的問題。

這是一個簡單的 select 和 order 子句。

此查詢(或任何其他限制少於一百萬的查詢)

SELECT * 
FROM mon_stat_detail 
WHERE 1 
ORDER BY id DESC
LIMIT 500000

正確使用列 id 上的索引(順便說一句。它不是主索引而是唯一索引)

在此處輸入圖像描述

雖然這個查詢

SELECT *
FROM mon_stat_detail 
WHERE 1 
ORDER BY id DESC
LIMIT 1000000

正在使用文件排序。

在此處輸入圖像描述

桌子很大,大約有 6000 萬。 記錄。

使用文件排序需要 15 分鍾,並且由於文件排序而在磁盤上創建超過 20GB 的數據

但是,如果我在同一個查詢上強制索引

SELECT * 
FROM mon_stat_detail FORCE INDEX (id_2) 
WHERE 1 
ORDER BY id DESC
LIMIT 1000000

它正在使用它,並且只需要幾秒鍾的時間。

在此處輸入圖像描述

知道為什么會這樣嗎? 為什么我需要在這樣一個簡單的查詢上強制使用這個索引?

(精簡架構:)

CREATE TABLE mon_stat_detail (
    id int(16) unsigned NOT NULL AUTO_INCREMENT, 
    sensor_id int(10) unsigned NOT NULL, 
    time datetime NOT NULL, 
    … other about 10 columns ... 
    PRIMARY KEY (sensor_id,time), 
    UNIQUE KEY id_2 (id), 
    … some more indexes and FK …
) ENGINE=InnoDB AUTO_INCREMENT=550579790 DEFAULT CHARSET=utf8

數據庫:

  • 服務器版本:10.1.48-MariaDB-0+deb9u2 - Debian 9.13
  • 協議版本:10
  • 如果目標是獲取任何一百萬行,請省略ORDER BY

  • 如果目標是獲取最后一百萬行並且id中沒有間隙,則使用

     WHERE id > (SELECT MAX(id) FROM mon_stat_detail) - 1000000 ORDER BY id ASC -- note; and no LIMIT is needed
  • 如果可能存在差距,您可以查看運行此(在 Select 之前)是否有幫助:

     ANALYZE TABLE mon_stat_detail;

對於 InnoDB,它速度很快,它會刷新查詢計划所基於的“統計信息”。

暫無
暫無

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

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