个人博客
欢迎访问个人博客: https://www.crystalblog.xyz/
备用地址: https://wang-qz.gitee.io/crystal-blog/
1. MySQL底层采用什么数据结构
2. 为什么MySQL的Innodb存储引擎必须要有主键
3. 一条SQL语句查询慢, 如何优化?
4. explain工具使用
5. Sql语句查询如何避免回表查询
6. 索引为何需要遵循最佳左侧法则?
7. like不走索引如何优化?
8. 千万级数据, 如何查询优化?
9. 如何分表分库? 分表分库后如何查询?
将一张大表的数据拆分成n张多子表数据存放. 那么一张表最多存放多少条数据呢?
阿里巴巴开发手册规范:
单表行数超过500万行或者单表容量超过2GB, 才推荐进行分表分库.
如果预计三年后的数据量根本达不到这个级别, 请不要在创建表时就分表分库.
分表分库存在缺陷, 数据如何分摊存放?
方案1: 全局且唯一, 连续的ID, ID%分表总数, 这种方式存在后期难以扩容的问题.
优点: 保证数据分摊均匀存放. 分片的字段必须保证连续性.
缺点: 后期无法扩容
方案2: 业务ID按照日期前缀生成, 按日期分表.(年,月,日)
按年分表, 会存在数据分布不均匀的问题. 可能2020年表只有100万, 2021年表有1000万数据.
可以按月分表会合理一些.
方案3: 分段形式(ID分段存储.), 支持无限扩容, 查询效率非常高. 下面以User表为例, 以500万数据进行分段:
查询语句如果没有带上分片字段
, 就会去查询所有结构表的数据, 查询语句需要带上分片字段
. 最好查询条件带上索引字段.
10. 分表分库后如何分页查询?
每张表分页查询数据, 交给数据库中间件(sharding-jdbc/mycat)整合后返回Limit数据给客户端.
sharding-jdbc
mycat