【发布时间】:2010-12-19 02:08:17
【问题描述】:
我目前正在学习 MySQL,并注意到许多不同的注意事项。
我是否可以在任何地方找到您参考或学习的最佳实践的绝对列表?
感谢您的宝贵时间。
【问题讨论】:
-
听起来可能是重复的:stackoverflow.com/questions/579244/…
标签: mysql
我目前正在学习 MySQL,并注意到许多不同的注意事项。
我是否可以在任何地方找到您参考或学习的最佳实践的绝对列表?
感谢您的宝贵时间。
【问题讨论】:
标签: mysql
使用 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 在版本 4 和 5 之间飞速发展,一些相当重要的 MySql 错误修复似乎指日可待(我正在考虑使用 count(distinct col1) from ... 的问题)。
我想到了几个问题:
http://forums.mysql.com/read.php?100,22967,66618#msg-66618
GROUP BY 使用的索引中列的顺序很重要:http://dev.mysql.com/doc/refman/5.1/en/group-by-optimization.html
COUNT(DISTINCT) 很慢:http://www.delphifaq.com/faq/databases/mysql/f3095.shtml
http://bugs.mysql.com/bug.php?id=17865
以下是本网站的一些其他问题,您可能会觉得有用:
【讨论】:
不要用全部大写的 SQL 来写,即使官方参考文件是这样写的。我的意思是,好的,这使得区分标识符和关键字非常明显。不,等等,这就是我们有语法高亮的原因。
【讨论】:
请使用 SQL_MODE“传统”。
SET SQL_MODE='TRADITIONAL'
或者把它放在你的 my.cnf 中(更好,因为你不会忘记它;但要确保它被部署到所有实例,包括开发、测试等)。
如果您不这样做,将无效值插入列无论如何都会成功。这通常不是一件好事,因为这可能意味着您会丢失数据。
在 dev 中打开它很重要,这样您可以及早发现这些问题。
【讨论】:
哦,我也需要这份清单……开玩笑的。不,问题是任何适用于 1 MB 数据库的东西都不会适用于 1 GB 数据库,同样适用于 1GB 数据库和 1TB 数据库。等等
【讨论】: