大型应用的性能的瓶颈大多都是处于数据库上,之前网络上一直有评价各种语言代表的东西,其中就有一张图片:表达的是PHP失去了Mysql就是一个断了的勺子,可见对于PHPer来说,Mysql有多少重要了。如果有经历过面向过程开发的PHPer,更能明白SQL语句书写的重要性了。使用ORM一些简单的优化帮你做了。
Mysql的语句的优化原则:
1. 尽量避免在列上进行运算,这样会导致索引失效。
例如:
SELECT * FROM test WHERE YEAR(created_at) >= 2016;
可以优化为:
SELECT * FROM test WHERE created_at >= '2016-01-03';
2.使用join的时候,应该使用小结果集驱动大结果集,同时把复杂的JOIN查询拆分为多个简单的Query,Join多个表的时候可能导致更多的锁定和堵塞
例如:
SELECT * FROM test1 as t1 LEFT JOIN test2 AS t2 ON t1.id=t2.id LEFT JOIN test3 as t3 ON t3.sn=t2.sn;
3.使用模糊查询的时候,尽量避免使用%%
例如:
SELECT * FROM test WHERE name LIKE %la%;
可以优化为:
SELECT * FROM test WHERE name >= 'vi';
4.尽量不要直接查询全部的字段,只查询自己需要的几个字段,这样不会影响查询速度,主要考虑节省内存
例如:
SELCT * FROM users WHERE user_id=1;
可以优化为:
SELECT id,name,age FROM users WHERE user_id=1;
5.尽量使用批量插入语句减少交互
例如:
INSERT INTO users (name,age) VALUES ('vilay',23);
INSERT INTO users (name,age) VALUES ('vilay3',28);
可以优化为:
INSERT INTO users (name,age) VALUES ('vilay',23),('vilay3',28);
6.limit基数比较大的时候使用between
例如:
SELECT * FROM users ORDER BY id desc limit 10000000,10;
可以优化为:
SELECT * FROM users WHERE id BETWEEN 10000000 AND 10000010 ORDER BY id desc;
大量数据查询的时候使用between限定比使用limit快,但是也有缺陷,如果10000000到10000010之间有几条数据被删了,就无法获得10条数据。使用倒序排列,减少limit的基数增加查询的速度。
7.不要使用rand函数获取多条随机记录
语句:
SELECT * FROM users order by rand() limit 10;