优化 MySQL 语句的十个建议
数据,经常更新的数据放在一个表,不经常更新的放在另一个表。这可以使缓存更高效,因为MySQL不需要让没有更新过的数据移出缓 存。5.不要过度使用artificial primary keyartificial primary key非常棒,因为他们使得schema更少的变化。如果我们将地理信息存在以美国邮编为基础的表中,如果邮编系统突然改变了,那我们就会有大麻烦了。另 一方面,采用natural key有时候也很棒,譬如我们需要join多对多的关系表时,我们不应该这样:1234567CREATE TABLE posts_tags ( relation_id int UNSIGNED NOT NULL AUTO_INCREMENT, post_id int UNSIGNED NOT NULL, tag_id int UNSIGNED NOT NULL, PRIMARY KEY(relation_id), UNIQUE INDEX(post_id, tag_id));artificial key完全是多余的,而且post-tag关系的数量将会受到整形数据的系统最大值的限制。12345CREATE TABLE posts_tags ( post_id int UNSIGNED NOT NULL, tag_id int UNSIGNED NOT NULL, PRIMARY KEY(post_id, tag_id));6.学习索引你选择的索引的好坏很重要,不好的话可能破坏数据库。对那些还没有在数据库学习很深入的人来说,索引可以看作是就是hash排序。例如如果我们用查询语句SELECT * FROM users WHERE last_name = ‘Goldstein’,而last_name没有索引的话,那么DBMS将会查询每一行,看看是否等于“Goldstein”。索引通常是B-tree(还有其他的类型),可以加快比较的速度。你需要给你要select,group,order,join的列加上索引。显然每个索引所需的空间正比于表的行数,所以越多的索引将会占用更多的 内存。而且写数据时,索引也会有影响,因为每次写数据时都会更新对应的索引。你需要取一个平衡点,取决每个系统和实施代码的需要。7.SQL不是CC是经典的过程语言,对于一个程序员来说,C语言也是个陷阱,使你错误的以为SQL也是一种过程语言(当然SQL也不是功能语言也不是面向对象的)。你不要想象对数据进行操作,而是要想象有一组数据,以及它们之间的关系。经常使用子查询时会出现错误的用法。123456SELECT a.id, (SELECT MAX(created) FROM posts WHERE author_id = a.id)AS latest_postFROM authors a因为这个子查询是耦合的,子查询要使用外部查询的信息,我们应该使用join来代替。12345SELECT a.id, MAX(p.created) AS latest_postFROM authors aINNER JOIN posts p ON (a.id = p.author_id)GROUP BY a.id8.理解你的引擎MySQL有两种存储引擎:M
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新IT计算机优化 MySQL 语句的十个建议(3)全文阅读和word下载服务。
相关推荐: