php - MySQL PDO 查询优化

标签 php mysql sql pdo

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

相关文章:

php - CodeIgniter db->查询在 SELECT 上返回 false

sql - 注册 SQL CLR 存储过程中使用的程序集

php - 更改日期中的时间戳

php - 从 MySQL 列获取唯一值

php - 一些图像显示,一些图像不显示(Broken X)

php - 使用html表单通过php在mysql中插入数据时查询为空错误

PHP登录重定向流程

mysql - SQL中删除字符串的一部分

php - 谷歌翻译 Curl 在 php 5.3.8 中耗尽所有内存

javascript - Bigcommerce - 如果未登录,如何将用户从主页重定向到登录页面