[英]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.