// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 查询当前页数据
$stmt = $pdo-prepare(
SELECT id, name, email
FROM users
WHERE id :lastId
ORDER BY id
LIMIT :perPage
);
$stmt-bindValue(':lastId', $lastId, PDO::PARAM_INT);
$stmt-bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt-execute();
$users = $stmt-fetchAll(PDO::FETCH_ASSOC);
SQL 优化
sql
低效(全表扫描)
SELECT * FROM orders WHERE status = 1 ORDER BY id LIMIT 1000000, 20;
优化(先查ID再关联)
SELECT o.*
FROM (
SELECT id FROM orders
WHERE status = 1
ORDER BY id
LIMIT 1000000, 20
) AS tmp
JOIN orders o ON tmp.id = o.id;
PHP 实现
php
$stmt = $pdo-prepare(
SELECT o.*
FROM (
SELECT id FROM users
WHERE id :lastId
ORDER BY id
LIMIT :perPage
) AS tmp
JOIN users o ON tmp.id = o.id
);
3、索引优化关键点
1、确保排序字段有索引:
sql
ALTER TABLE users ADD INDEX idx_id (id);
4、高级优化方案
(1) 使用 `WHERE + IN` 替代 `OFFSET`
php
// 假设已知上一页最后10个ID
$lastIds = [1000000, 1000001, ..., 1000009];
$stmt = $pdo-prepare(
SELECT * FROM users
WHERE id IN (.implode(',', $lastIds).)
ORDER BY id
);