mysql数据库小巧灵活开源免费性能高效是世界上最受欢迎的关系型数据库,公司(民营)和个人网站不出意外的话首选就是MySQL了,对它的优化是重中之重,本宝宝不才,愿意昭示所学的积累。
1.查询的简单优化:
ps:如果不熟悉expain命令,可参看:https://www.cnblogs.com/xuanzhi201111/p/4175635.html
1).先准备表:
2).准备数据
索引(可能设计不合理):
3).需求(自己瞎编,不要在意这些细节):
拿着订单的Id查到关于用户的支付信息(其他暂时不考虑,因为考虑也没毛用),
4).SELECT语句:
select * from use_order where orderId =11
上面是没有任何优化的语句也是最简单的语句,显而易见性能最差,造成全表扫描(虽然走了索引)
type:all是select语句中效率最差的一个,这个不可以被接受
ps:all表示遍历匹配整张表我这个例子只有几条数据所以很快,面临大量数据和高并发是否还是选择这条SQL呢?
select id from use_order where orderId =11
上面的这个SQL走了查询类型(expain)是Index表示比上面那条SQL要快效率要高,主要原因是通过索引去找索引
orderId是普通索引,Id是唯一索引,效率立马就提上了,但是执行这个SQL有俩个毛病在线上时候我怎么知道用户的Id呢?
还有一旦规范了写法:select id,名字,支付时间,支付状态 from use_order where orderId =11 立马变成了全表扫描,SQL效率立马杀回来了,type:all,走的索引是orderId的,没有走UserId的唯一索引。
但是提供 了个思路通过索引去找索引。
ps:这里有引出了个概念索引失效了,这段SQL的id索引失效主要原是没有遵守最左匹配原则。
select userName,area,payStatus,FROM_UNIXTIME(payTime,'%Y-%m-%d %H:%i:%S') from use_order WHERE id = ( select id from use_order where orderId =11) and orderId =11
第三段SQL语句是优化完毕后的查询语句(实际开发业务我们尽可能的把函数计算放在业务层,尽可能遵守够少够用的原则)
第三段SQL的大体思路: select 选择出来我们需要的字段,子查询查出User的唯一标识 ,通过User的唯一索引查找orderId索引。
2.索引:
索引的概念类似于字典的目录,本质的目的就是加快准确找到硬盘上的的数据,但是索引不是万能的,在一定程度上面让磁盘承受一定的压力,而且比较严谨,不是合理的设计对表的本身都是一种伤害,使用索引口诀:大哥不能挂,中间的弟弟不能断,
栗子:select index1,index2,index 3 from table(最左原则),2.select feild1,feild2 from table where xx=index1 and yy=index2(索引生效)
严禁索引参与数学运算:max(),min(),sum(),count()以上函数运算会导致索引失效
也严禁字符串拼接和逻辑计算:
正列:select index from xxx ,select * from table where x = index
反例:select index+"str" from xxx,select * from table xxx != index
总之一句话:索引的数据是不能改变。
子查询和join查询对比:
PS:个人建议把那子查询替代JOIN在业务开发上面,其他的我不做评价
select * from a as a left join b as b on a.xxx = b.xxx
上面的sql合理合法但是不可用:原因效率低下,