字符集
怎么选择合适的字符集?目前建议都是使用utf8mb4,可以有效兼容emoji表情。
MySQL的字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。
校对规则的命名:
1. 以_ci结尾(大小写不敏感)
2. 以_cs结尾(大小写敏感)
3.以_bin结尾(二元,比较是基于字符编码的值)
索引
旧版的MyISAM和5.6.24以上InnoDB引擎都支持全文索引
最左匹配原则,使用索引的最左前缀来查找行。
设计索引的原则:
1.索引最适合出现的列为where子句中的列,或者连接子句中指定的列。
2.使用唯一索引,索引的数据有区分度。
3.利用最左前缀。
4.不要过度索引。索引过度会占用磁盘空间并降低写操作的性能。
5.InnoDB存储引擎的表,记录默认会按照一定的顺序保存,所以尽量自己指定主键,提高查询的效率。
Hash 索引和Btree索引
1. HASH仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
2. Btree可支持模糊查询和范围查询,除了like以%起头的。
视图
从查询结果中创建一个虚拟表来使用。
存储过程:
封装一段SQL操作到脚本中,通过CALL执行。
存储过程的好处在于处理逻辑都封装在数据库端,调用者不需要了解中间的处理逻辑,一旦逻辑发生僧变化,只需要修改存储过程即可,对调用者没有影响。
这里还是建议逻辑部分在应用端编写。
触发器:
是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。可以协助应用在数据库端确保数据的完整性。
不过这个trigger也可以在应用端完成,更易读且易维护。
分布式事务
资源管理器(RM)和事务管理器(TM)的通讯,由TM链接各个RMs,告知要执行的命令。
要考虑到通讯中断以及数据完整性,和某个分支出现故障的解决。
SQL的安全问题
PHP可以使用PDO的参数绑定,避免拼接SQL的出现。
pdo是一个php的扩展,为php访问数据库定义了一个轻量级的一致接口。
SQL Mode及相关问题
STRICT_TRANS_TABLES 适用于事务表和非事务表,它是严格模式,不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告.
严格模式下,对sql的要求更高,比如group by的数据必须出现在select 里面。