编写 mysql 查询的注意事项
Posted
技术标签:
【中文标题】编写 mysql 查询的注意事项【英文标题】:do's and don'ts for writing mysql queries 【发布时间】:2010-04-23 07:49:42 【问题描述】:在编写查询时我一直想知道的一件事是我是否在编写最优化的查询?我知道某些事情,例如:
1) 使用 SELECT field1, filed2 而不是 SELECT *
2) 为表提供适当的索引
但我确信在编写查询时应牢记更多事项,因为大多数数据库只能增长更多,而优化查询将有助于缩短执行时间。您能分享一些编写查询的提示和技巧吗?
【问题讨论】:
这个问题应该是社区维基 【参考方案1】:测试是衡量性能的最佳方式。监控您对实时数据库的查询,并使用 slow query log。
我还建议启用 query cache,这将为大多数典型的使用情况带来巨大的提升。
【讨论】:
是的,Rikh 这似乎是 gr8,但我只是想知道是否有最好的查询,而且它甚至不在我们的脑海中。【参考方案2】: 为您的字段使用正确的数据类型 为保留关键字使用反引号 (`) 在处理多个表时,尝试使用 joins资源:
见:
20 SQL Tips
【讨论】:
【参考方案3】:除了注意事项之外,您可能会发现Hidden Features of mysql 很有用。
【讨论】:
【参考方案4】:事实上,没有任何“提示”可以帮助您。 数据库设计需要深厚的知识,而不是技巧。
这些“不要”总是有“重量”的。大多数此类列表都列出了最不重要的事情而没有提及重要的事情。例如,您的列表是烹饪论坛:
-
始终使用黑柄刀
要准备好菜肴,您需要选择合适的食材。
第一个令人印象深刻,但在现实世界中无济于事。 第二个是正确的,但必须有深厚的知识支持才能使它正确。
所以,它必须是一本书,而不是提示。推荐来自 Paul Dubios 的作品。
【讨论】:
“我只要求有权有势的人诚实地回答问题,如果他们不能,请解释原因。” - 比尔奥莱利【参考方案5】:必须在每个表中使用以下字段
tablename_id( auto increment , unsigned zerofill)
created_by( timestamp)
tablerow_status( enum ('t','f') by default set 't')
-
当您在 mysql 中创建字段时,请务必发表评论(当您在 phpmyadmin 中搜索时会有所帮助))
始终注意规范化表单
如果你在做一些总是积极的领域,那么选择无符号。
在某些情况下使用小数数据类型而不是浮点数(如折扣,它应该是最大 99.99% 所以使用小数(5,2)
在需要的地方使用日期、时间数据类型,不要到处使用时间戳
【讨论】:
【参考方案6】:相关的子查询非常糟糕,但通常没有很好地理解并最终投入生产。它们通常可以通过使用派生表和连接来修复。 http://en.wikipedia.org/wiki/Correlated_subquery
【讨论】:
【参考方案7】:我今天发现的另一件事是关于 COUNT(*) 和 COUNT(col) 之间的区别
使用 COUNT(*) 比使用 COUNT(col) 快
MYISAM 表缓存了该表中的行数,因为 innoDB 不缓存行数,如果没有 WHERE 子句可能会更慢
对于MYISAM 和innoDB 使用NOT NULL 列比使用其他允许Null 的列更好。
更多详情here
【讨论】:
以上是关于编写 mysql 查询的注意事项的主要内容,如果未能解决你的问题,请参考以下文章