1, mysql InnoDB 和MyIsam 区别

  1. InnoDB支持事务, MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务 ,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个务;
  2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MylSAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索弓|和辅助索引|是独立的。
  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MylSAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高

2, 索引

索引( Index )是帮助MySQL高效获取数据的数据结构。常见的查询算法、
顺序查找,二分查找、多叉排序树查找、哈希散列法分块查找,平衡多路搜索树B树( B-tree) , 索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于快速获取信息

mysql有4种不同的索引:

  • 主键索引( PRIMARY )
  • 唯一索引( UNIQUE )
  • 普通索引( INDEX )
  • 全文索引( FULLTEXT )
  • 联合索引
  • 覆盖索引

索引并非是越多越好,创建索引也需要耗费资源, -是增加了数据库的存储空间,二是在插入和删除时要花费较多的时间维护索引

  • 索引加快数据库的检索速度
  • 索引降低了插入、删除、修改等维护任务的速度
  • 唯一索引可以确保每一行数据的唯一 -性
  • 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
  • 索引需要占物理和数据空间

3, 索引原则有哪些

  1. 选择唯一性索引 ,唯一性索引的值是唯一的 ,可以更快速的通过该索引来确定某条记录
  2. 为经常需要排序、分组和联合操作的字段建立索引
  3. 为常用作为查询条件的字段建立索引
  4. 限制索引的数目,越多的索引,会使更新表变得很浪费时间。尽量使用数据量少的索引
  5. 如果索引的值很长,那么查询的速度会受到影响。尽量使用前缀来索引
  6. 如果索引字段的值很长,最好使用值的前缀来索引
  7. 删除不再使用或者很少使用的索引
  8. 最左前缀匹配原则

4, mysql 主从同步是怎么做的?

mysql 同步是通过binlog来实现的,由于mysql默认的复制方式是异步的
1, master提交事务,写入到binlog
2, slave 连接master ,获取binlog
3, master创建dump线程,推送binglog到slave
4,slave 开启一个IO线程,读取master同步过来的binlog日志,并写入本地relaylog
5, slave 开始一个sql_thread,读取relaylog,并在slave 执行,完成同步
6,slave 记录自己的日志

mysql 问题 - 图1

全同步复制
主库写入binlog后强制同步日志到从库,所有的从库都执行完成后才返回给客户端,但是很显然这个方式的话性能会受到严重影响
半同步复制
半同步复制的逻辑是这样,从库写入日志成功后返回ACK确认给主库,主库收到至少一个从库的确认就认为写操作完成

5, 主从同步延迟怎么解决?


没办法解决,只能根据业务需求,需要走主库的走主库查询。