MySQL - 做与不做

时间:2009-11-21 19:33:11

标签: mysql

我目前正在学习MySQL,并注意到很多不同的做法和不应做的事。

我是否可以在任何地方找到您所经历或从中学到的最佳实践的绝对列表?

感谢您的时间。

5 个答案:

答案 0 :(得分:5)

使用InnoDB;不要使用MyISAM。

(好的,好的,除非你绝对,通常是由于InnoDB中没有全文配对。即便如此,你最好把规范数据放在InnoDB和全文索引中在一个单独的MyISAM searchbait表上,然后您可以处理该词表。)

如果需要严格的字符串匹配,请使用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

答案 1 :(得分:3)

嗯,由于目标职位不断发展,所以不会有绝对的dos和dont列表。 MySql在版本4和版本5之间实现了跨越式发展,并且MySql的一些相当重要的错误修复似乎即将到来(我正在考虑使用count(distinct col1) from ...)的问题。

以下是一些问题:

  1. 不依赖于视图能够在基础表上使用索引
  2. http://forums.mysql.com/read.php?100,22967,66618#msg-66618

    1. GROUP BY打算使用的索引中的列顺序非常重要:
    2. http://dev.mysql.com/doc/refman/5.1/en/group-by-optimization.html

      1. COUNT(DISTINCT)很慢:
      2. http://www.delphifaq.com/faq/databases/mysql/f3095.shtml

        1. 虽然可能有一个错误修复即将到来....
        2. http://bugs.mysql.com/bug.php?id=17865

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

          Database opimization

          Database design with MySql

          Finetuning tips

答案 2 :(得分:2)

不要在所有大写中写入SQL,即使正式参考也是如此。我的意思是,好的,它使得对于标识符和关键字之间存在差别感到非常乐观。不,等等,这就是为什么我们有语法突出显示。

答案 3 :(得分:1)

使用SQL_MODE“Traditional”。

SET SQL_MODE='TRADITIONAL'

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

如果不这样做,无论如何都要在列中插入无效值。这通常不是好事,因为它可能意味着您丢失了数据。

重要的是它在开发中打开,你也会尽早发现这些问题。

答案 4 :(得分:0)

哦我也需要这个清单..开玩笑。不会。问题是1 MB数据库无论对1 GB数据库有用,对1GB数据库和1TB数据库都是如此。等