簡體   English   中英

MySQL PDO查詢優化

[英]MySQL PDO query optimization

我正在嘗試減少此腳本的執行時間。 它在一個循環中查詢大約200萬條記錄的數據庫約1000次:

foreach ($ids as $id){
    $stmt=$dbh->query("SELECT SQL_CACHE * FROM `ids` 
                WHERE $id BETWEEN `id_start` AND `id_end`");
    $rows[] = $stmt->fetch();
}

在4核8 GB的計算機上,這將永遠花費(大約800秒!)。 id組不重疊,id在每次執行中往往來自幾個不同的組,並且我對(id_start,id_end)和(id_end)都建立了索引。

緩存可以大大改善這種情況(多次運行相同的1000個值僅需幾秒鍾),但是我想知道我該怎么做才能加快非緩存查詢的速度。

EXPLAIN的示例輸出:

"id"    "select_type"   "table"     "type"  "possible_keys"     "key"               "key_len"   "ref"   "rows"  "Extra"
"1"     "SIMPLE"        "ids"       "range" "id_start,id_end"   "id_start,id_end"   "5"          ""     "52508" "Using index condition"

編輯 :有時會得到“在哪里使用”而不是“使用索引條件”(不確定,但我認為ID值要高於840771583)為什么?

編輯2 :完整的創建代碼:

CREATE TABLE `ids` (
    `id_start` INT(10) UNSIGNED NULL DEFAULT NULL,
    `id_end` INT(10) UNSIGNED NULL DEFAULT NULL,
    `iso-639-1` VARCHAR(2) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `country_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `region_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `city_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `area_code` VARCHAR(16) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `timezone` VARCHAR(6) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    UNIQUE INDEX `id_startid_end` (`id_start`, `id_end`),
    INDEX `id_end` (`id_end`),
    INDEX `country_name` (`country_name`),
    INDEX `region_name` (`region_name`),
    INDEX `city_name` (`city_name`),
    INDEX `area_code` (`area_code`),
    INDEX `iso-639-1` (`iso-639-1`),
    INDEX `timezone` (`timezone`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;

由於時間間隔不重疊,請嘗試以下查詢重寫:

SELECT * 
FROM ids
WHERE id_start =
      ( SELECT MAX(id_start) 
        FROM ids
        WHERE id_start <= $id
      )
  AND $id <= id_end ;
It queries a database with about 2 million records about 1000 times on a loop:
                                                         ^^^^^^^^^^^^^^^^^^^^   

這里

是你的問題。

肯定應該是一個查詢。

還可以考慮調整mysql守護程序,以確保密鑰緩沖區大小是否足夠。

順便說一句,這個問題與PDO毫無關系。 處理問題時,您必須盡可能縮小范圍,取出所有不必要的部分。 說到查詢,您必須將其帶入控制台並在那里進行播放。

暫無
暫無

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

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