Mysql 笔记
1. 表设计
字段名称:简短明了,见名识意,多词汇使用下划线连接。禁止使用mysql保留关键字。字段数量建议(建议来自百度网友)在20以内。
类型:尽可能使用可以存下数据的最小数据类型。int (tinyInt > ... bigInt) > datatime > varchat (char > varcha) > blob。
长度:业务字段可能产生的最长字符长度。
主键:
唯一主键:为了查询和处理的效率,主键一般设置在整数上。且值不能重复(设置自增)。
联合主键(过往项目无涉及,暂不做了解。):
索引:
建立索引:
在主要常用于条件查询的字段创建索引,保持索引优势及开销的平衡,如性别值基本为3种且随机则建立索引意义不大。索引的建立与维护也需要一定的资源开销(空间和时间),建议(建议来自百度网友)索引不超过30个。
hash 还是 Btree?(待纪录... 索引方式对where 表达式的支持)
提出问题:如果存在一种情况。字段值依旧非0即1,但是数据库中存在0随着时间的变化逐渐转变为1.后续的查询条件只查询等于1的数据,那么此时是否存在创建该索引的必要性。
默认值:根据字段含义添加默认值。如为避免程序生成sql导致的错误也可以添加必填字段
注释:应简短描述字段所表示的内容,必要时应展示实例。
引擎:根据表的业务场景、MYISAM和innoDB的特点选择引擎。
编码:为了存储一些特殊字符,一般默认选择utf8mb4。
静态表&非静态表:
分表:
2. sql 优化
查询内容:仅查询必要展示的字段。
连表:
查询条件:
where 条件是从左到右执行的,所以能排除最多纪录的条件应该靠左优先。然后是普通索引,然后是其他条件。
尽量避免使用 or 查询,可能会导致索引失效。导致可能而不是必然的原因是 or 前 后 的条件是否使用了索引,如果有一个未走索引那么查询结果和没走索引类似。如果 or 前 后 都使用到了索引,那么or 前 后 的索引各自生效。优化器会自动选择是有需要索引合并(index merge )(来自百度网友)。
尽量不要在索引上使用计算函数,这会导致索引失效。
like查询如果是通配符在前面,则会使索引失效。
计算函数:(涉及计算时,计算逻辑应写到sql 还是自身程序,写多少如何划分?)
索引:使用explain 查看索引使用情况进行索引优化。参考链接
子查询:
临时表:
3. 索引结构
hash:
Btree:
问题:hash 和 Btree 对于某些 where 表达式在索引上的支持。
4. 事务&锁
事务:
特性:原子性,一致性,隔离性,持久性。
隔离级别:
读未提交(READ UNCOMMITTED)
读提交 (READ COMMITTED)
可重复读 (REPEATABLE READ)
串行化 (SERIALIZABLE)
锁:
5. 分表&分表数据查询
6. 处理死锁
- 一:直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。
- 二:发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。
7. 常用sql
8. 如何减少行锁对性能的影响
将最可能出现死锁或者竞争的行放到事物的最后执行,减少记录持有行锁的时间。

浙公网安备 33010602011771号