1.mysql中造成索引失效的原因有哪些?如何分析和解决?
原因:
1.like以通配符%开头索引失效 通常用的索引数据结构是B+树,而索引是有序排列的
优化:一种是使用覆盖索引,另一种是把%放后面
2.字段类型是字符串,where时没有用引号括起来。表中的字段为字符串类型,是B+树的普通索引,如果查询条件传了一个数字过去,它是不走索引的。
3.OR 前后只要存在非索引的列,都会导致索引失效
4.联合索引(组合索引),查询时的条件列不是联合索引的第一个列,索引失效
5.计算、函数、类型转换(自动或手动)导致索引失效,索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效
6.is null可以使用索引,is not null无法使用索引
7.左连接查询或者右连接查询查询关联的字段编码格式不一样
8.mysql估计使用全表扫描要比使用索引快,则不使用索引
2.mysql的分库分表的原因是什么,什么时候进行分库分表
因为数据库以一张表上查询大量数据会效率会很低,所以当查询大量数据的时候
1.水平分库:
以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。
结果:
每个表的结构都一样;
每个表的数据都不一样,没有交集;
所有表的并集是全量数据;
2.垂直分库:
以表为依据,按照业务归属不同,将不同的表拆分到不同库中
结果:
每个库的结构都不一样;
每个库的数据也不一样,没有交集;
所有库的并集是全量数据;
纵向分表:将本来一个表中那个数据,根据数据的活跃度进行分离(因为不同活跃的数据,处理方式是不同的)
横向分表:根据数量的规模来划分,保证单表的容量不会太大
3.mysql的主从复制,解决的是什么问题?如何进行主从复制
解决问题:
(1).读写分离
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,
这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,
通过读从库也可以保证业务的正常运作
(2).数据实时备份
提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而
不破坏主服务器相应数据;
(3).高可用
因为数据库服务器中的数据都是相同的,当Master挂掉后,可以指定一台Slave充当Master继续保证服务的运行,因为数据是一致性的(如果当插入时Master就挂掉,
可能不一致,因为同步也需要时间)当然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Slave的数据同步到Master。
在主服务器上执行写入和更新,在从服务器上向外提供读功能,达到读写分离的效果,也可以动态地调整从服务器的数量,从而调整整个数据库的性能。
在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。
(4).架构扩展
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。
有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,
提高单个机器的I/O性能
MySQL 主从复制有三种方式:
(1)基于SQL语句的复制(statement-based replication,SBR)
就是记录sql语句在bin-log中,Mysql 5.1.4 及之前的版本都是使用的这种复制格式。
优点是只需要记录会修改数据的sql语句到bin-log中,减少了bin-log日质量,节约I/O,
提高性能。缺点是在某些情况下,会导致主从节点中数据不一致(比如sleep(),now()等)
(2)基于行的复制(row-based replication,RBR)
mysql master 将SQL语句分解为基于ROW更改的语句并记录到 5 bin-log中,也就是只记录哪条数据被修改了,修改成什么样。
优点是不会出现某些特定情况下的存储过程、或者函数、或者trigger的调用或者触发无法被正确复制的问题。
缺点是会产生大量的日志,尤其是修改table的时候会让日志暴增,同时增加bin-log同步时间。也不能通过bin-log解析获取执
行过的sql语句,只能看到发生的data变更
(3)混合模式复制 (mixed-based replication,MBR)
对于一般的复制使用STATEMENT模式保存到bin-log,对于STATEMENT模式无法复制的操作
则使用ROW模式来保存,MySQL会根据执行的SQL语句选择日志保存方式
4.mysql的读写分离是怎么回事?
读写分离:
就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询
,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库
5.优化mysql的方案有哪些?
(1)SQL和索引优化
使用正确的索引,分段查询,
(2)数据库结构优化
最小数据库长度,使用最简单数据类型,尽量少定义text类型,选择合适的存储引擎,适当分库分表策略
(3)系统硬件优化
磁盘,网络,内存