Я пытаюсь сократить время выполнения этого скрипта. Он запрашивает базу данных о 2 миллиона записей о 1000 раз по петле: (! Около 800 секунд)Оптимизация запросов MySQL PDO
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 Гб машине. Группы идентификаторов не пересекаются, иды в каждом исполнении имеют только несколько разных групп, и я проиндексировал оба (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"
EDIT: Вместо «Использование индекса состояния» я получаю «Использование где» иногда (не уверен, но я думаю, что из идентификатор значения выше, чем 840771583) Почему?
EDIT 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;
Что 'EXPLAIN' сказать о запросах? Использует ли он индексы? – Barmar
@Barmar Да, похоже. Я отредактировал, чтобы добавить вывод 'EXPLAIN'. – NotGaeL
Эта таблица является таблицей только для чтения? Предполагая «Разделение чтения/записи». И какой механизм хранения он использует? – Drazzi