gpt4 book ai didi

php - MySQL PDO 查询优化

转载 作者:行者123 更新时间:2023-11-29 04:22:54 25 4
gpt4 key购买 nike

我正在尝试减少此脚本的执行时间。它在一个大约有 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 ;

关于php - MySQL PDO 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18649094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com