做和不做写的mysql查询

时间:2010-04-23 07:49:43

标签: performance mysql query-optimization

在撰写查询时我总是怀疑的一件事是,我是否在编写最优化的查询?我知道某些事情:

1)使用SELECT field1,filed2而不是SELECT *

2)为表格提供适当的索引

但我确信在编写查询时应该记住更多的事情,因为大多数数据库只能增长更多,最佳查询将有助于执行时间。你能分享一些关于编写查询的技巧和窍门吗?

7 个答案:

答案 0 :(得分:3)

测试是衡量绩效的最佳方式。监控实时数据库中的查询并使用 slow query log等内容。

我还建议启用 query cache ,这将为大多数典型的使用情况带来巨大的推动。

答案 1 :(得分:2)

  • 为您的字段使用正确的数据类型
  • 对保留关键字使用反划线字符(`)
  • 处理多个表格时,请尝试使用加入

<强>资源:

请参阅:

<强> 20 SQL Tips

答案 2 :(得分:1)

除了Do's和Dont's之外,您可能会发现Hidden Features of MySQL很有用。

答案 3 :(得分:1)

事实上,没有“提示”可以帮助你 数据库设计需要深入的知识,而不是提示

这些“不要”总有“重量”。大多数此类列表都列出了大多数不重要的内容,而没有提到重要的内容。例如,您的列表是否是烹饪论坛:

  1. 始终使用带黑色手柄的刀
  2. 要准备好菜,你需要选择合适的食材。
  3. 第一个令人印象深刻,但从未在现实世界中提供帮助 第二个是正确的,但必须有深厚的知识支持才能做到正确。

    所以,它必须是一本书,而不是提示。推荐使用Paul Dubios的人。

答案 4 :(得分:1)

在每个表格中使用以下字段

tablename_id( auto increment , unsigned zerofill)
created_by( timestamp)
tablerow_status( enum ('t','f') by default set 't')
  1. 在mysql中创建一个字段时总是发表评论(当你在phpmyadmin中搜索时会有帮助))
  2. alwayz负责规范化表格
  3. 如果你做一些alwayz肯定的字段,那么选择unsigned。
  4. 在somw情况下使用十进制数据类型而不是浮点数(如折扣,它应该是最大99.99%所以使用十进制(5,2)
  5. 在需要的地方使用日期,时间数据类型,不要在任何地方使用时间戳

答案 5 :(得分:1)

相关的子查询非常糟糕,但通常不太了解并最终投入生产。它们通常可以通过使用派生表和连接来修复。 http://en.wikipedia.org/wiki/Correlated_subquery

答案 6 :(得分:0)

我今天发现的另一件事是关于COUNT(*)和COUNT(col)

之间的区别

使用COUNT(*)比COUNT(col)

更快

MYISAM表缓存了此表中的行数,因为innoDB不会缓存行数,如果没有WHERE子句可能会更慢

对于MYISAM和innoDB,最好使用NOT NULL列,而不是允许Null的其他列。

更多详情here