在 PHP 查询 MySQL 数据库时,提高查询速度需要从数据库设计优化、SQL 语句优化、PHP 代码优化和服务器配置等多个方面综合考虑。以下是具体可行的优化方案:
合理设计表结构
避免使用 TEXT/BLOB 等大字段存储频繁查询的数据,可拆分到独立表。
选择合适的数据类型(如用INT
代替VARCHAR
存储数字,DATE
代替字符串存储日期)。
遵循三范式,减少冗余字段,避免表过大。
添加高效索引
对WHERE
、JOIN
、ORDER BY
、GROUP BY
涉及的字段建立索引。
示例:为查询条件中的id
和category_id
建立索引
使用EXPLAIN
分析查询计划定位查询瓶颈,查看是否使用索引、是否全表扫描:
关注type
列(ALL
表示全表扫描,需优化;ref
/range
表示使用索引)。
关注key
列(显示实际使用的索引,为NULL
则未使用索引)。
优化查询语句
只查询需要的字段,避免SELECT *
:
合理使用LIMIT
限制返回行数,尤其分页查询
避免在WHERE
子句中对字段做函数运算(会导致索引失效):
减少JOIN
关联表数量,大表JOIN
时确保关联字段有索引。
复用数据库连接
避免频繁创建连接(连接开销大),使用单例模式或全局连接:
启用持久连接(PDO::ATTR_PERSISTENT => true
),减少 TCP 握手开销。
批量操作代替循环单条操作
批量插入 / 更新,减少与数据库的交互次数:
缓存查询结果
对不频繁变动的数据(如分类列表、配置信息),使用缓存减少数据库查询:
MySQL 配置调整
增加innodb_buffer_pool_size
(推荐设置为服务器内存的 50%-70%),缓存热点数据。
调整query_cache_size
(适用于 MySQL 5.7 及以下,8.0 已移除),缓存查询结果。
开启慢查询日志(slow_query_log = 1
),定位执行时间长的 SQL(long_query_time = 1
秒)。
数据库读写分离
主库(Master)负责写入,从库(Slave)负责查询,分散压力:
使用LIMIT 1
:如果只需要一条记录,加上LIMIT 1
让数据库查到即停止。
避免SELECT COUNT(*)
:对大表统计行数,可用近似值(如EXPLAIN
的rows
字段)或定期缓存结果。
分区表:对超大型表(如千万级以上)按时间或业务维度分区,缩小查询范围。
优化核心思路:减少数据库压力(缓存、读写分离)、加速单条查询(索引、SQL 优化)、减少交互次数(批量操作、连接复用)。实际应用中,建议先用EXPLAIN
分析慢查询,定位瓶颈后针对性优化,避免盲目加索引或调整配置。
版权所有 © 2012-2026 光谷科技 Corporation.