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. 如何减少行锁对性能的影响

  将最可能出现死锁或者竞争的行放到事物的最后执行,减少记录持有行锁的时间。

  

posted @ 2021-08-05 14:52  `YU  阅读(35)  评论(0)    收藏  举报