大型应用的性能的瓶颈大多都是处于数据库上,之前网络上一直有评价各种语言代表的东西,其中就有一张图片:表达的是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;

8.避免使用null

9.不要使用count(id),使用count(*)

10.不要做无谓的操作,尽可能在索引中完成排序。。