您的位置:首页 >Ubuntu PHP日志中的数据库查询优化
发布于2026-08-06 阅读(0)
扫一扫,手机访问
在Ubuntu上跑PHP应用,日志里那些慢查询如果没人管,早晚会拖垮整个系统的响应速度。与其被动的等用户吐槽,不如主动从数据库查询入手,做几件实实在在的优化工作。下面这些步骤,大部分都是实操中反复验证过的,可以直接拿过去用。

数据库自己不会告诉你哪个查询慢,但你可以让它记下来。在MySQL的配置文件(my.cnf或my.ini)里加上这几行:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
这两秒是阈值,超过两秒的查询都会被记下来。改完配置记得重启MySQL服务:
sudo systemctl restart mysql
光知道慢还不够,得知道它为什么慢。EXPLAIN是个好工具,加在查询前面,就能看到MySQL是怎么一步步执行这条SQL的——有没有走索引,扫描了多少行,一目了然。
EXPLAIN SELECT * FROM your_table WHERE your_column = 'value';
如果看到type是ALL(全表扫描),那基本上就是性能瓶颈所在。
有时候查询慢,纯粹是因为没建索引。给经常出现在WHERE、JOIN、ORDER BY后面的列加上索引,效果立竿见影。
CREATE INDEX idx_your_column ON your_table(your_column);
注意,索引不是越多越好,写操作频繁的字段要谨慎加索引,否则写入性能会受损。
SELECT *,这是新手最容易犯的毛病只取你真正需要的列,减少数据传输量,也减少MySQL的负担。
SELECT your_column1, your_column2 FROM your_table WHERE your_column = 'value';
如果一张表有几十个字段,SELECT *会把所有数据都拉出来,网络和内存开销都上去了。
每次请求都新建一个数据库连接,再断开,开销非常大。使用连接池(比如PHP的pdo_mysql配合持久连接,或者更专业的php-pm、Swoole)可以复用连接,显著降低延迟。
写PHP时,尽量用预处理语句。不仅安全,还能让MySQL重复使用执行计划,省去SQL解析的开销。
$stmt = $pdo->prepare('SELECT * FROM your_table WHERE your_column = :value');
$stmt->execute([':value' => 'your_value']);
$results = $stmt->fetchAll();
对于那些不怎么变化的数据,比如用户配置、分类列表,完全可以用Redis或Memcached缓存起来。一次查询,多次使用,数据库压力瞬间降下来。
数据表长期使用后,碎片会增多,索引效率也会下降。定期执行OPTIMIZE TABLE可以整理碎片、重建索引。
OPTIMIZE TABLE your_table;
优化不是一锤子买卖。用起来pt-query-digest、mysqldumpslow这类工具,定期分析慢查询日志,及时发现新的慢查询,才能持续保持性能。
当单表数据量达到千万级甚至亿级,即使有索引,查询也可能变慢。这时候可以考虑分区(把一张表物理上拆成多个文件)或分表(按业务逻辑拆成多张表),让每次查询只扫描一小部分数据。
假设你在PHP日志里发现这样一条慢查询:
SELECT * FROM users WHERE email = 'example@example.com';
那就先用EXPLAIN看看:
EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';
如果发现possible_keys是NULL,说明没有索引可用。给email字段加上索引:
CREATE INDEX idx_email ON users(email);
再跑一次EXPLAIN,确认索引已经生效,rows从全表扫描变成了1行,性能提升立竿见影。
以上这些步骤,覆盖了从日志发现、分析、优化到持续监控的完整链路。只要坚持做下去,Ubuntu上的PHP应用性能只会越来越好。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8