SQL优化:
一.常见的sql优化的方法有:
- 添加索引(index)
- 普通索引,
- 主键索引,
- 唯一索引 unique,
-
全文索引 ,
2.分表设计(水平分割,垂直分割)
3.读写分离:
4.写存储过程:
5.对mysql配置优化:配置最大并发my.ini,调整缓存大小;
6.mysql服务器硬件升级;
7.定时去清除不需要的数据,定时进行碎片整理(MYISQM)
8.表的设计合理,满足三范式要求;
分库分表:
垂直拆分:网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程,最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也非常有利于进行局部的优化和治理,保障核心模块的稳定性垂直拆分用于分布式场景。
水平拆分:垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里
索引:
什么是索引:索引用来快速的查询那些具有特定值得记录,所有的MYSQL索引都是B-数的形式保存;没有索引,查询就会从第一个记录开始全表扫描,直到找到符合要求的数据;表里面的记录越多,这个操作的代价就会越大;如果搜索条件的列上已经创建了索引,那么无需全表扫描,很快就会定位到要查询的数据,效率会高很多倍;
为什么使用索引:提高查询效率,
索引的分类:
- 主键索引:唯一性;必须指定为primary key ,
索引的实现原理:B+树 (折半查找)
底层采用折半查找 或二分查找法:
先找一个中间数,进行比较,左边为大的数据,右边为小的数据,在根据要查询的数据进行拆分,再次找中间数,以此类推,继续找中间数,进行排列,
索引的缺点:
添加、删除效率降低,因为索引文件也需要更新,
唯一索引:在字段的最后面加上unique;
create table t_user (id int primary key auto increment,name varcher(32) unique);
unique 字段可以为NULL,并且可以有多个NULL,但是如果是具体的内容,则不能重复,但是不能存在有重复的空字符串‘’ ;
普通索引:由关键字KEY或INDEX定义的索引,它的任务是加快对数据的访问速度,
create index 索引名 on 表名 (列 1,列 2);
执行计划:
添加索引后查看索引,用执行计划 explain 后跟sql语句, 显示 type为all 则没有添加索引,为ref则表示该字段添加了索引;
全文索引:
创建全文索引:在sql中添加,FULLTEXT(字段名称,字段名称),添加什么字段表示该字段就是全文索引;
数据库引擎的对比:
索引的代价:
- 占用磁盘空间;
- 对DML(update,delete,isert)语句的效率影响;
- 增删则会对索引影响,因为索引要重新整理;
索引的优缺点:
优点:提高查询效率
缺点:增加、删除慢,索引文件需要跟新,增加内存;
什么字段适合做索引:
- 添加查寻次数较多的字段
- 值有很多的不同
- 建立索引 在WHERE 条件需要查询的,并且值有很多的不同的时候
如何定位慢查询:
mysql的数据引擎:
- inndb:插入和添加最多,事务机制,很安全,行锁,不支持全文检索
- myisam:批量处理,表锁,支持全文检索,,定时清理碎片化
- memory:
Mysql的读写分离:
Mysql高可用:
高并发、redis nginx
MySQL的各种高可用方案,大多是基于以下几种基础来部署的:
主从复制:原理:通过二进制sql执行文件;
双节点数据库,搭建单向或者双向的半同步复制,如果主库发生故障,切换到备库后仍然可以继续使用数据库
优点:
主(master) :核心数据访问,读写操作
备(slave) : 主挂了,主服务器灾备机;
架构比较简单,使用原生半同步复制作为数据同步的依据;
双节点,没有主机宕机后的选主问题,直接切换即可;
双节点,需求资源少,部署简单;
缺点:
完全依赖于半同步复制,如果半同步复制退化为异步复制,数据一致性无法得到保证;
需要额外考虑haproxy、keepalived的高可用机制。
数据库读写分离:好处:提高IO性能,减少阻塞;
主机 可以操作 CRUE;备机只能进行查询操作,不能进行写的操作,
当有一条查询语句需要执行的时候,是去查备机,主机插入一条数据进去
当有一条插入语句的时候,去走主机;备机通过长连接获取(二进制sql执行文件)在获取数据的时候,有可能会延迟,此时会采用重试机制,
读数据和写数据是分开操作的,读写分离,数据同步;
负载均衡、转发:
好处:不暴露IP地址,安全系数高;降低权限;
源码分析: