mysql 数据库优化问题

可以先看一下我的另一篇文章:《MySQL调优(慢查询、EXPLAIN以及索引、分页优化)》

然后还有一个博文:《MySQL性能优化的最佳21条经验》
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
两个存储引擎的区别:
详见我的另一篇文章:《mysql的存储引擎以及InnoDB和MYISAM的索引结构》
在这里插入图片描述
在这里插入图片描述

索引的使用场景:
不会频繁变化的多个值(经常在where语句中出现;不会频繁变化;字段的内容不是多个)、
注意:

  1. 注意最左前缀优先原则
  2. 如果是like aaa%, 通配符在后的可以使用索引,反之像%aaa就不行
  3. 如果where查询条件中有or,其中有条件没有使用索引,那么即使有条件带了索引,也不会使用索引(也就是说,要求所有索引字段都能单独使用索引);
  4. 表里只有一条记录,使用全表扫描比索引更快,就不用索引。

数据库分表问题:

水平分表和垂直分表(按行和按列)

当表中的数据灰常多的时候我们查询效率就灰常低,可能造成表锁,甚至堆积很多连接直到挂掉,所以这时候适合水平分表;

如果有一个字段数据较大或者值较长(长文本、二进制等),又不是很经常查询到,就可以将这些字段单独列出放在一个表中,通过 外键关联(例如,考试表:只关注分数,不关系考试详情 ,就可以将详细信息放在另一个单独的表中。)

水平分表的策略:
  1. 按照时间:用于有时效性的数据,有一定的限制性:像微信聊天记录这种,一般不会查询几个月前的数据,就放在另一个表中,即按月分表;
  2. 按照区间:一般都用于有严格的自增主键的情况下,例如userID从1~100w的分成一个表,,,依次类推。
  3. 按照hash分表:将原表中的id或者name使用hash算法计算出对应的表名,将数据存入对应的表中,访问相应的表。
读写分离

并发量很大的时候进行集群操作,mysql的最常用的集群处理技术就是读写分离。

主从同步和读写分离:
主从同步就是所有将数据持久化到磁盘(写)的操作都由主数据库服务器进行,其他数据库进行copy主数据库中的数据进行同步;
读写分离就是,写就写入主数据库,读就读从数据库的服务器中。

使用缓存

在dao(持久层)和数据库之间添加一个缓存层,因为缓存是内存级存储,因此可以减轻数据库的压力。

hibernate的二级缓存,不能实现分布式缓存;
redis(memecache等)做中央 缓存。

语句优化

在这里插入图片描述
DDL 数据定义语言(*):1. 禁用索引:set table tb_user disable keys;2.set unique checks=0;关闭唯一校验 3.关闭事务 set autocommit=0;

DML 数据操作语言(*):批量插入(将一次提交修改为多次提交)

DQL 数据查询语言: order By多使用 索引;group by中去掉默认排序,order by null;or中左右两边最好都用到索引,否则索引失效(如果name和email是一个复合索引,name=“mu” or email=“huhu”不会用到索引)
在这里插入图片描述

详细的mysql相关问题见 《mysql总结和面试》

猜你喜欢

转载自blog.csdn.net/mulinsen77/article/details/88888201