下面主要讲一下常用的sql大局上的优化技巧,对于底层不做过多解释。
1.尽量走索引,如果可以的话,可以尝试联合索引,但是索引不易过多,因为这样mysql维护索引的成本会增加,写入,删除会变慢。
2.表的主键尽量是递增的整数,这样的话对于索引而言是有益的,索引文件会相对小,读取会相对快一点
3.利用冗余数据的方式,例如想要查看一个订单的下单用户名,那么t_order里面一般都会有user_id,那么再根据user_id去t_user表查user_name即可,但是这样就会多一次查询,因此可以考虑把user_name也存到t_order表当中,但是这样的话就会增加t_order表的存储空间(简单的以空间换时间的方式),这个问题还是不算什么,最主要的是一旦用户更改了用户名,那是不是就需要同步订单里的user_name喃?这个其实就可以根据实际业务去考虑了,更不更新都可以接受。
4.mysql是列式存储,因此建议表的字段不易过多,并且如果有不常用且文本过长的字段,那么建议通过外键(不是真正的外键哈)来实现,提高读取效率。
5.利用好mysql的limit 1这个方式,例如selectById那么找到一条就不会读了。
6.对于行锁的优化,尽量让行锁的持有时间最小化,那么我举例:买东西打账,只考虑单机
分为了以下的步骤
)1.给买家扣钱 update a set money = money - xx
)2.给卖家加钱 update a set money = money + xx
那么就是两条语句,但是顺序尤为重要,首先考虑顺序是 2 ,1
那么一个买家在未完成1之前,其他所有买家都会卡在2这个步骤上,那么大部分时间是都在阻塞,这是不合适的,
如果顺序是1,2的话,那么大家就都会各自完成自己的1,等一个买家完成2并提交之后,其他买家也能快速完成2,然后提交,这样极大程度减少了行锁的占有时间。