优化MySQL语句的几个绝招Jaslabs的JustinSilverton列出了十条有关优化MySQL查询的语句,我不得不对此发表言论,因为这个清单非常非常糟糕
另外一个Mike也同样意识到了
所以在这个博客中,我要做两件事情,第一,指出为什么这个清单很糟糕,第二,列出我的清单,希望我的比较好些
继续看吧,无畏的读者们
为什么那个清单很糟糕1
很好的问题,但是很糟糕的解决方法Silverton先生提出了一些很好的问题
MySQL针对长度可变的列如TEXT或BLOB,将会使用动态行格式(dynamicrowformat),这意味着排序将在硬盘上进行
我们的方法不是要回避这些数据类型,而是将这些数据类型从原来的表中分离开,放入另外一个表中
下面的schema可以说明这个想法:1
CREATETABLEposts(2
idintUNSIGNEDNOTNULLAUTO_INCREMENT,3
author_idintUNSIGNEDNOTNULL,4
createdtimestampNOTNULL,5
PRIMARYKEY(id)6
CREATETABLEposts_data(9
post_idintUNSIGNEDNOTNULL
bodytext,11
PRIMARYKEY(post_id)12
他的力气没使对地方我们要遵循的一个准则就是如果你要优化代码时,应该先找出瓶颈在哪
然而Silverton先生的力气没有用对地方
我认为60%的优化是基于清楚理解SQL和数据库基础的
你需要知道join和子查询的区别,列索引,以及如何将数据规范化等等
另外的35%的优化是需要清楚数据库选择时的性能表现,例如COUNT(*)可能很快也可能很慢,要看你选用什么数据库引擎
还有一些其他要考虑的因素,例如数据库在什么时候不用缓存,什么时候存在硬盘上而不存在内存中,什么时候