赞
踩
MySQL的索引使用
默认会有主键索引。
索引分类:单值索引、复合索引、唯一索引
MySQL explain 分析
MySQL通过explain
关键字分析SQL的执行计划。(Oracle通过EXPLAIN PLAN FOR sql
)
ID | SELECT_TYPE | TABLE | PARTITIONS | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | FILTERED | EXTRA |
---|---|---|---|---|---|---|---|---|---|---|---|
system -> const -> eq_ref -> ref -> ref_or_null -> index_merge -> index_subquery -> range -> index -> all
。说说反模式设计
数据库范式能够使数据库表的设计更加规范,但会导致业务模型涉及的表过多,一次查询需要多次关联,导致性能变差。出于对性能的保护,提出了反模式设计。核心思想是:空间换时间,数据冗余避免表关联过多产生的问题。
说说分库与分表设计
一般表数据大于500万行或单表容量超过2GB。
分库分表策略(分片策略):1、日期 2、Hash 3、范围 4、税率
数据库中间件:MyCat 、 ShadingJDBC
分库分表后查询逻辑:
分库与分表带来的分布式困境与应对之策
产生的问题含有:跨库JOIN问题、排序分页问题、分布式ID问题
跨库JOIN应对之策:
1)建立全局表,存放所有模块可能依赖的字段,但只能存不怎么修改的字段。
2)字段冗余设计,也就是反模式设计
排序分页应对之策:
1)增大PageSize
2)禁止跳页查询,只允许下一页
分布式ID应对之策:
1)UUID
2)数据库自增
3)号段模式
4)类似雪花算法
说说SQL优化之道
1)定位慢SQL
2)分析执行计划
3)增加索引或修改SQL
MySQL遇到的死锁问题
1、本人经历过的数据库连接数导致生产死锁的问题
正常逻辑为:A请求B数据->请求C数据->释放连接。
数据库连接数为8,恰逢8个请求占有了连接数,连接未释放;此时新进的请求需要连接,相互等待资源释放,却又因为B->C连接数满无法等到,导致死锁。
存储引擎MyISAM和InnoDB
MyISAM不支持事务。
由于多数系统都需要数据库的事务支持,MyISAM不支持事务,因此现有大部分都是InnoDB存储引擎。
数据库索引的原理
Mysql以B+树为数据结构,通过树结构存储索引的数据,并在叶子结点存储索引的值。
为什么要使用B树
查询效率高。
聚集索引与非聚集索引的区别
聚集索引:一个表只能有一个。占用空间较非聚集索引小。
limit 20000 加载很慢,如何处理
MySQL的性能低是因为数据库要去扫描N + M条记录,然后又要放弃之前N 条记录,开销很大。
1、缓存进行优化
2、延迟关联:先通过limit查找索引字段,再通过原表和索引字段关联获得需要的数据
选择合适的分布式主键方案
根据每个方案进行分析:
1)UUID
简单,长度过长,没有具体业务含义,不利于索引。
2)数据库自增
2.1 单节点:创建一个表,每次插入一条数据,根据返回的自增主键为分布式主键。单节点有宕机风险。
2.2 集群:不同集群的自增设置起始值和步长。后期扩容时,需要考虑冲突。
3)号段模式
一批号段的主键ID,用完再次申请。
4)类似雪花算法
64位的ID,各大厂商有自己的一些开源框架,自行查看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。