mysql基础+主从复制读写分离高可用原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql基础+主从复制读写分离高可用原理相关的知识,希望对你有一定的参考价值。

1)创建数据库            create database wpj1105;

2)创建数据库            create database wpj1105;

3)判断是否存在库 :        drop database if exists wpj1105;

4)使用该数据库           use wpj1105; 5)#显示数据库中的表      show tables;

6)创建表create table student( id int auto_increment primary key, name varchar(50) not null, sex varchar(20), date varchar(50), content varchar(100) )default charset=utf8;

7)查找表   select xxxxx from student;

8)显示表的结构:desc  student;

9)添加数据 insert into student values(null,'aa','男','1988-10-2','......');

10)修改数据表的编码方式:ALTER TABLE `test` DEFAULT CHARACTER SET utf8

11)ALTER TABLE `test` CHANGE `name` `name` VARCHAR(36) CHARACTER SET utf8 NOT NULL; 该命令用于将表test中name字段的编码方式改为utf8

12)修改某一条数据update student set sex='男' where id=4;

13)delete from student where id=5;

14删除数据delete from student where id=5; 15)# and 且select * from student where date>'1988-1-2' and date<'1988-12-1'; 16)# or 或   select * from student where date<'1988-11-2' or date>'1988-12-1'; 17)#between   select * from student where date between '1988-1-2'and'1988-12-1';

18)修改数据update c set age=66 where id=2;update c set name='花花',age=21,sex='女' where id=2

 

技术分享图片

视图:视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

         使用场合:权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary...关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;

         比如有三张表,表一:学生姓名,学号,住址,表二:科目id,科目名称,对应课程,表三:学生id,对应的科目id。此时如果我要找到一个学生的信息:

SELECT
    `uc`.`id` AS `id`,
    `u`.`name` AS `username`,
    `c`.`name` AS `coursename`FROM
    `user` `u`LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))WHERE
    u.`name` = '小张'

如果创建视图:

 ALGORITHM  `view_user_course`   `user_course` `uc`  ((`u`.`id`   `course` `c`  ((`uc`.`courseid`

此时如果需要查询语句:则

SELECT
    vuc.username,
    vuc.coursenameFROM
    view_user_course vucWHERE
     vuc.username = '小张'

ALGORITHM=UNDEFINED:指定视图的处理算法;

DEFINER=`root`@`localhost`:指定视图创建者;

SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;

即可完成,要说的是,视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);但是它确实会存在于数据库之中,所以对于表和视图在数据库中如果没有很好的区分,

实现视图的方式有两种,分别为合并算法和临时表算法,合并算法是指查询视图时将视图定义的sql合并到查询sql中,比如create view v1 as select * from user where sex=m;当我们要查询视图时,mysql会将select id,name from v1;合并成select id,name from user where sex=m……;临时表算法是先将视图查出来的数据保存到一个临时表中,查询的时候查这个临时表。不管是合并算法和临时表算法都会带来额外的开销,;且如果使用临时表后会使mysql的优化变得很困难,比如索引。而且视图还引入了一些其他的问题,使得其背后的逻辑非常复杂。所以在现在很少用到视图了。


索引:首先声明一下索引是针对于一个数据表中的列的,分为两种:单列索引和组合索引。它的作用就是用于快速找出在某个列中有一特定值的行。

         Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

         PRIMARY KEY(主键索引)  ALTER TABLE `table_name` ADD PRIMARY KEY ( `col` ) 

         UNIQUE(唯一索引)     ALTER TABLE `table_name` ADD UNIQUE (`col`)

         INDEX(普通索引)     ALTER TABLE `table_name` ADD INDEX index_name (`col`)

         FULLTEXT(全文索引)      ALTER TABLE `table_name` ADD FULLTEXT ( `col` )
         组合索引   ALTER TABLE `table_name` ADD INDEX index_name (`col1`, `col2`, `col3` )  

     创建索引:
      1.经常需要搜索的列上,可以加快搜索的速度;
      2.作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
      3.经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
      4.经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
      5.经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
      6.经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

    索引的优缺点
    优点:
      1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
      2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
      3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
      4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
      5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

    缺点:
      1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
      2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。
      3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

      因为索引非常占内存,所以索引也需要谨慎添加,那些字段需要索引。

引擎:

        mysql主要有两种引擎:innodb和myiasm。

                两种存储引擎的大致区别表现在:
         1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
         2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
     3)InnoDB支持外键,MyISAM不支持
4)从MySQL5.5.5以后,InnoDB是默认引擎
5)InnoDB不支持FULLTEXT类型的索引
6)InnoDB 中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时MyISAM也需要扫描整个表
7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'









 

以上是关于mysql基础+主从复制读写分离高可用原理的主要内容,如果未能解决你的问题,请参考以下文章

mysql主从复制-读写分离-原理

MYSQL的主从复制与读写分离

高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离

MySQL高可用读写分离集群视频课程 MyCat教程

MySQL主从复制读写分离

MySQL 主从复制与读写分离(原理深刻,过程详细,值得一看)