【问题标题】:MySQL - Do's and Don'tsMySQL - 做与不做
【发布时间】:2010-12-19 02:08:17
【问题描述】:

我目前正在学习 MySQL,并注意到许多不同的注意事项。

我是否可以在任何地方找到您参考或学习的最佳实践的绝对列表?

感谢您的宝贵时间。

【问题讨论】:

标签: mysql


【解决方案1】:

使用 InnoDB;不要使用 MyISAM。

(好的,好的,除非您绝对必须这样做,通常是由于 InnoDB 中不提供全文匹配。即使这样,您通常最好将规范数据放在 InnoDB 和全文索引中在单独的 MyISAM 搜索诱饵表上,然后您可以对其进行处理以进行词干提取。)

当您需要严格的字符串匹配时,请使用 BINARY 列,否则默认情况下会进行不区分大小写的比较。请为您的字符集正确设置排序规则(最好:UTF-8),否则不区分大小写的比较会表现得很奇怪。

如果您希望代码可移植,请使用 ANSI SQL 模式。 ANSI_QUOTES 允许您使用标准双引号 "identifier"(表、列等)名称来避免保留字; MySQL 的默认表达方式是反引号,但它们是非标准的,在其他地方不起作用。如果您无法控制这样的设置,请省略任何标识符引用并尽量避免保留字(这很烦人,因为在不同的数据库中有很多)。

请使用您的数据访问层的 MySQL 字符串文字转义或查询参数化功能;不要尝试自己创建转义文字,因为它们的规则比您想象的要复杂得多,如果您弄错了,您就会遇到 SQL 注入漏洞。

当您选择对 GROUP BY 列没有功能依赖的列时,不要依赖 MySQL 返回特定行的行为。这是其他数据库的错误,很容易隐藏只有在数据库内部存储发生变化时才会弹出的错误,导致返回不同的行。

SELECT productid, MIN(cost)
FROM products
GROUP BY productcategory  -- this doesn't do what you think

【讨论】:

  • 很好的答案!但是,我建议避免使用 mysql 的怪异“功能”,它允许您从列中检索值,这些值在 group by 子句中未提及。这根本没有任何意义。避免我的意思是“从不这样做”。假装它产生了错误。
  • 是的,这也是我的建议,除非您按行的主键分组并从该行检索其他列。在这种情况下,它们对 GROUP BY 有“功能依赖”,因此它在 ANSI SQL 中有效并且在其他数据库中也有效。当然,您也可以将所有这些列添加到 GROUP BY 子句中,但是如果有很多列,那就有点麻烦了。
【解决方案2】:

好吧,随着球门柱不断移动,不会有绝对的注意事项列表。 MySql 在版本 4 和 5 之间飞速发展,一些相当重要的 MySql 错误修复似乎指日可待(我正在考虑使用 count(distinct col1) from ... 的问题)。

我想到了几个问题:

  1. 不要依赖视图来使用基础表上的索引

http://forums.mysql.com/read.php?100,22967,66618#msg-66618

  1. GROUP BY 使用的索引中列的顺序很重要:

http://dev.mysql.com/doc/refman/5.1/en/group-by-optimization.html

  1. COUNT(DISTINCT) 很慢:

http://www.delphifaq.com/faq/databases/mysql/f3095.shtml

  1. 虽然可能会有一个错误修复即将到来....

http://bugs.mysql.com/bug.php?id=17865

以下是本网站的一些其他问题,您可能会觉得有用:

Database opimization

Database design with MySql

Finetuning tips

【讨论】:

    【解决方案3】:

    不要用全部大写的 SQL 来写,即使官方参考文件是这样写的。我的意思是,好的,这使得区分标识符和关键字非常明显。不,等等,这就是我们有语法高亮的原因。

    【讨论】:

    • 全部大写不会影响查询的性能。
    【解决方案4】:

    请使用 SQL_MODE“传统”。

    SET SQL_MODE='TRADITIONAL'
    

    或者把它放在你的 my.cnf 中(更好,因为你不会忘记它;但要确保它被部署到所有实例,包括开发、测试等)。

    如果您不这样做,将无效值插入列无论如何都会成功。这通常不是一件好事,因为这可能意味着您会丢失数据。

    在 dev 中打开它很重要,这样您可以及早发现这些问题。

    【讨论】:

      【解决方案5】:

      哦,我也需要这份清单……开玩笑的。不,问题是任何适用于 1 MB 数据库的东西都不会适用于 1 GB 数据库,同样适用于 1GB 数据库和 1TB 数据库。等等

      【讨论】:

      • 不,一些适用于 1Mb 数据库的东西仍然适用于 1 TB 数据库。但总的来说,是的,你是对的。
      猜你喜欢
      • 1970-01-01
      • 2013-07-20
      • 2014-01-10
      • 2014-05-30
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多