分类 mysql 中的文章

mysql|分库分表

为什么需要分?

关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。

……

阅读全文

mysql|使用注意

设计

  1. 设计的合理性,能否容忍冗余字段,尽量一张表,方便开发
  2. 考虑使用记录表,记录一些查询和修改的记录信息
  3. 考虑业务的使用情况,设置相关索引,加速查询和修改
  4. 分库分表的合理性
  5. 存储量的预估
  6. 业务访问量的预估,是否会造成db的压力

使用

  1. 使用时间戳存储时间
  2. 使用datetime等时间格式,注意时区问题,注意设置数据库的时区
  3. 字符集问题注意
  4. 根据业务的qps和服务器的性能,合理设置连接池大小和链接时间、读取写入时间、超时时间
  5. 修改和删除数据时一定要加where语句
  6. 修改和删除时一定要先使用limit测试
……

阅读全文

mysql|explain

explain

explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。

字段

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

……

阅读全文

mysql|join

join流程分类

Index Nested-Loop Join

分析语句select * from t1 straight_join t2 on (t1.a=t2.a);

上述语句中t2的a字段存在索引,则join流程如下

  • 从表 t1 中读入一行数据 R;
  • 从数据行 R 中,取出 a 字段到表 t2 里去查找;
  • 取出表 t2 中满足条件的行(使用索引),跟 R 组成一行,作为结果集的一部分;
  • 重复执行步骤 1 到 3,直到表 t1 的末尾循环结束。

这个过程是先遍历表 t1,然后根据从表 t1 中取出的每行数据中的 a 值,去表 t2 中查找满足条件的记录。在形式上,这个过程就跟我们写程序时的嵌套查询类似,并且可以用上被驱动表的索引,所以我们称之为Index Nested-Loop Join,简称 NLJ。

……

阅读全文

mysql|全表扫描问题

全表扫描流程

InnoDB 的数据是保存在主键索引上的,所以全表扫描实际上是直接扫描表 t 的主键索引。这条查询语句由于没有其他的判断条件,所以查到的每一行都可以直接放到结果集里面,然后返回给客户端。

……

阅读全文

mysql|删除流程

数据删除

删除整个表的时候,可以使用 drop table 命令回收表空间。但是,我们遇到的更多的删除数据的场景是删除某些行,这时就遇到了这样的问题:表中的数据被删除了,但是表空间却没有被回收。

……

阅读全文