ERP开发总结
前言
通过本周的开发学到了很多技术和业务上的知识,这周最大的收获,是一次在执行SQL查询的过程中,我发现不过是几千条的数据,却用了10多秒的处理时间,就在想能不能有什么办法对自己写的sql语句进行优化,之后我在网上查找了许多资料,将自己开发常用的几条优化方法分享出来。
1.避免在where子句中对字段进行null值判断和进行表达式操作
比如
1 | select id from duser WHERE id*100=200; |
这样对字段进行算术运算,会造成引擎放弃使用索引,可以改成
1 | select id from user WHERE id=200/100; |
2.尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描
1 | SELECT * FROM t WHERE id = 1 OR id = 3 |
可以用union代替or
1 | SELECT * FROM t WHERE id = 1 |
(PS:如果or两边的字段是同一个,如例子中这样。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表)
3.少用in 或 not in
对于连续的数值范围查询尽量使用BETWEEN AND,例如:
1 | select name from duser where id BETWEEN 10 AND 100 |
4.使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。
EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序,比如,要确定一个查询是否是覆盖索引,我们只需要explain sql语句看Extra的结果是否是“Using index”即可。
以duser表举例,可以对name字段查询试一下
1 | explain select * from duser where name='姚福泉'; //查询的name无法从索引数据获取 |