为什么SQL优化这么重要?
答:SQL优化是提高系统性能性价比最高的一种方式
- 优化成本:硬件>系统配置>数据库表结构>SQL及索引。
- 优化效果:硬件<系统配置<数据库表结构
五个原则
总结
语法顺序
1. SELECT
2. DISTINCT <select_list>
3. FROM <left_table>
4. <join_type> JOIN <right_table>
5. ON <join_condition>
6. WHERE <where_condition>
7. GROUP BY <group_by_list>
8. HAVING <having_condition>
9. ORDER BY <order_by_condition>
10.LIMIT <limit_number>
从from表名
根据条件on,连接其他表
根据联表(虚表)的结果where
对虚表的筛选结果进行分组group by
再使用having关键字对分组结果进行筛选
select
distinct
order by
limit
模糊查询会导致数据库引擎放弃索引进行全表扫描
原SQL
select * from user where username like '%李%'
优化方式:尽量在字段后面使用模糊查询
select * from user where username like '李%'
使用该关键字会导致引擎走全表扫描
原SQL
select * from user where id in (2,3)
优化方式:使用between或者exists关键字代替
使用or关键字会导致数据库引擎放弃索引进行全表扫描
原SQL
select * from user where id=1 or id=3
优化方式:使用union代替or
select * from user where id=1
union
select * from user where id-3
进行null值判断,会导致数据库引擎放弃索引进行全表扫描
原SQL
select * from user where score = null
优化方式:设计数据表时给字符设置默认值,例如0,对0值进行判断
会导致数据库引擎放弃索引进行全表扫描
原SQL
select * from user where score/10 = 9
优化
select * from user where score = 10*9
复合(联合)索引:part1/part2/part3三列,但是sql语句where条件未包含part1,按照Mysql联合索引的最左匹配原则,不会走联合索引
select * from user where part2=1 and part3=2
假设keyPart字段为字符类型,但给定的是数值,涉及隐式类型转换,不能走索引
select * from user where keyPart = 123
两者的条件要一致,否者order by 不会利用索引进行排序
select *总结:在查询过程中尽可能缩小结果集