1、 多用整型(int族)
2、 需要精度的浮点型数据使用decimal,不需要精度的最好使用double
3、 定长字符串尽量用char,最长有255个字符,处理速度比varchar块
4、 表结构尽量使用“不是null”和EmptyString
5、 单表不要太多字段20-30个就好
6、 引擎选择:
a) 根据业务情况选择
i. 以读写插入为主的,如博客、门户网站
ii. 以更新删除并要求数据完整性且并发量高的,如OA、自动化办公
7、 最好不要使用数据库锁
8、 索引: 用于优化where、order by、 join语句
索引是一种优化查询的数据结构,索引文件也是会越来越大的,不能长期放在内存中,所以我们考虑是用什么索引时,更要考虑那个数据结构的索引更能提高磁盘IO效率
a) 普通索引:对关键字无限制
b) 唯一索引:要求记录提供的关键字不能重复
c) 主键索引:关键字唯一且非null
那些数据结构可以提高查询效率?
哈希表、完全平衡二叉树、B树、B+树等
这些数据结构有什么区别呢,MYSQL为什么用B+树呢?
a) 哈希表可以精确查询,但不支持范围查询,因为会出现哈希算法出来的数组下标会冲突
b) 完全平衡二叉树是有序的,所以支持范围查找,基于左树小于右树,但一个节点只支持存储一个元素,所以会很高,查询效率也很低
c) B树也是类似二叉树,有序,但一个节点可存放多个元素,所以比完全平衡二叉树“矮”,查询效率会更高一些
d) B+树则是在B树的基础上在会将非叶子节点冗余一份到叶子节点中,并用指针相连,更能在提高IO效率的同时,兼顾更大的查询范围
B+树的叶子节点可以存放那些东西?
B+树存放的是整行数据,也可能是主键的值
两者有什么区别?
B+树的叶子节点存储了整行数据的是主键索引也被称为聚簇索引;而索引B+树的叶子节点存储了主键的值得是非主键索引,也被称为非聚簇索引。
两者查询数据的时候有区别吗?
聚簇索引查询会更快
为什么?
因为主键索引的叶子节点直接就是我们要查询的整行数据了,而非主键索引的叶子节点是主键的值,查到它后,还要通过一次回表查询
非主键索引一定会查询多次吗?
通过覆盖索引也可以只查询一次
什么是覆盖索引?
指一个查询语句的执行结果只用从索引中就能够取得,不用再回表操作,提高效率
创建索引时会考虑哪些因素呢?
查询频率较高的或者作为where条件的字段设置索引
联合索引多个字段之间顺序你们是如何选择的?
在创建多列索引时,会遵循最左匹配原则,将where子句中使用最频繁的放在最左边,mysql在检索数据时会优先从联合索引的最左边开始匹配
你知道mysql5.6中对索引做了哪些优化吗?
索引下推:简称ICP,可以在索引遍历过程中,对索引包含的字段先做判断,过滤掉不符合条件的记录,减少回表
索引有没有生效是通过什么排查呢?
可以通过explain查看sql语句的执行计划,通过执行计划来分析索引使用情况
什么情况下明明创建了索引,但是执行的时候并没有起作用呢?
条件中使用了OR、IN等逻辑,或者使用了函数,导致无法通过树查找命中数据,或者是底层优化器认为代价太高所以没有执行
9、 事务
总共有四种隔离级别:
a) 未提交读:事务A修改某条数据时,并未提交,但事务B已经可以查询到此修改数据,造成脏读现象
b) 已提交读:事务A修改某条数据时,修改后事务B查询为初始数据,A提交后,B此时查询的结果与之前的不一致,出现了不可重复读现象
c) 可重复读:事务A修改某条数据时,修改后事务B查询为初始数据,A提交后,B再读,仍为初始数据,A插入一条新数据,B再读发现仍未变化,B提交后再次读取数据,发现改变虽然解决了脏读和不可重复读,但出现了幻读现象
d) 可串行化:事务A启动,B无法启动,进入等待状态(可能超时),A提交事务,B进行操作,保证了不会出现以上三种情况,但会完全串行化,因此会极大地营销效率
10、分区
a) 水平分割:通过建立结构相同的几张表分别存储数据
b) 垂直分割:将经常使用的字段放在一个独立表中,分割后的表记录之间是一一对应关系
c) 分表原因:为数据库减压、分区算法局限
d) 集群:从根本上提升数据库性能——读写分离、负载均衡
11、读写分离
a) 依赖主从复制,从机不能写只能读
12、负载均衡
a) 轮询
b) 加权轮询:根据处理能力来加权
c) 负载分配:依据当前的空闲状态
13、慢查询日志