1:mysql所在服务器内核 优化   ---------此优化可由系统运维人员完成

2:mysql配置参数优化(my.cnf) -------- 此优化需进行压力测试来进行参数调整

3:sql语句及表优化

  ①为查询缓存优化你的查询   有数据库实现   当某字段查询过多时候 mysql进行 缓存处理

  ②explain sql    分析sql 语句 是否 通过主键  或者缓存

  ③若返回结果只需要一条时候  使用limit 1   ,原理  短路原理  当mysql 发现你要的数据时 就不会继续的对比其他数据是否吻合

  ④建立索引   索引分 普通索引(Normal) --》普通字段使用    唯一索引 (Unique) ---》主键字段使用    全文检索(Full Text)--》text类型字段使用

    误区 模糊查询走索引吗?   当被查询的字段 有索引 并且 参数 左边为固定值右边模糊值 此次查询将通过索引   示例 select * form user where username like "zhang%"

  ⑤join 查询时候  表与表之间关联字段 要求同一类型   若为varcher类型 则字符集要求也一致    select * from a left join b where a.id=b.id    ID都为索引 mysql会为join进行生sql优化 分布式数据库不建议使用

  ⑥ 千万不要 ORDER BY RAND()  随机选取数据返回  如有业务需求  则在业务处理层 进行随机数

  ⑦mysql中 select *少用   应该需要什么就取什么字段数据 全部就加上全表字段

  ⑧每张表 一定创建 主键  int类型主键 优于varcher类型  

  ⑨某些字段使用enum类型 mysql中enum类型采用tinyint类型  如“性别” ,状态等  而没有必要去使用varchar存储

  ⑩尽量保证 字段为not null  官方不建议使用

  11。让表字段固定长度  当表中字段有“varchar”,“text” “blob” 时这张表就不是固定长度 ,固定长度 mysql写入数据是按照偏移量进行操作 所以会更快

  12。垂直分割表 当一张表 中的字段超过20个 建议分表 存放

  13。delete 与 insert 操作 会进行锁表  批量型操作 可以放在访问量较小的情况下进行

  14 磁盘性能是程序 最大的性能瓶颈  字段内的值越小 速度越快

  15 存储引擎  

MyISAM是MySQL的默认存储引擎(5.5以前),基于传统的ISAM类型,支持B-Tree,全文索引,但不是事务安全的,而且不支持外键。不具有原子性。支持表锁。

    MyISAM适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于     SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB是事务型引擎,支持ACID事务(实现4种事务隔离级别)、回滚、崩溃恢复能力、行锁。以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

    InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务

  16 永久链接 连接池 慎重设置 

---------主从复制 与读写分离----------------

实现原理  mysql 主表在进行更新操作时候  会把更新的内容 以二进制的方式 写入log中 从表中log中读取数据并更新 避免了数据更新锁表的状态 提高并发负载能力

注意嵌套sql语句 容易引发错误

-----------虚拟机----------搭建服务器demo----------------------

Ip,192.168.1.8 为 mysql-proxy 服务器   192.168.1.6为mysql主数据库 进行写入操作   192.168.1.7 为从数据库 进行查询操作

在线安装 mysql   命令 yum  -y install mysql-server

启动数据库服务 service mysqld  start

设置mysql 登录密码  mysqladmin  -u  root password 'root'

登录mysql    mysql -u root -p 输入密码 后进入

设置外网IP登录  use mysql;  使用系统配置表

insert into user(host,user,password) values('192.168.1.5' ,'zhangsan','123456')

--->flush privileges  刷新数据库权限

利用通配符实现任意外网机器访问

update  user set host='%'       进行权限刷新后就可以外部访问了

测试 外部访问  mysql -u root -p -h192.168.1.6

设置 192.168.1.6为主数据库    分别编辑数据库配置文件  vi /etc/my.cnf

在首行 插入server-id=1   logb-bin=mysql-bin  并保存退出  重启mysql

再次登录mysql  进行状态查询,出现我们配置的server-id  说明配置成功

SHOW VARIABLES LIKE 'server_id';

查看 master数据的状态 show master status;

接下来 配置从服务器  192.168.1.7

修改

vi /etc/my.cnf

在首行 插入server-id=2   logb-bin=mysql-bin  并保存退出  重启mysql  再次查询

配置主从依赖 再 从服务器上输入

  1. change master to
  2. master_host='192.168.1.6',    #表示主服务器地址
  3. master_user='root',
  4. master_password='root',
  5. master_log_file='mysql-bin.000001',  #日志文件名
  6. master_log_pos=106;          #日志路径

---启动从服务器的同步线程 mysql> start slave;并查看状态 mysql> show slave status\G

当Slave_IO_Runningmysql与Slave_SQL_Running 的值都为YES,表示状态正常

然后在主数据库进行测试  顺利配置完成

注意事项  1,server-id 以及 log-file的文件位置 2,防火墙 端口号3306  3,mysql的外部机器访问权限

-------------------配置代理 服务器 192.168.1.8---------------------------------------

检测运行库文件是否齐全  yum -y install gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*libevent* glib* readline*

若文件不齐则自动在线安装   安装完成后 再此执行  出现 nothing to do  表示文件安装完毕

检查linux 系统内核版本

去mysql官方网站下载对应的 mysql-proxy 安装文件 mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz

版本 不对应 容易引发 rpm 管理混乱  造成意外错误

将文件安装 到 /opt/目录下   安装后名称过长  进行改名为 mysql-proxy   查看mysql-proxy的目录结构

查找mysql-proxy读写分离的脚本文件

将此文件 复制一份 到 自定义目录下  作为我们操作的脚本  这里 我放在了 /mysql-proxy/scripts文件夹

---mysql的帮助文档查看

修改rw-spliting.lua的默认配置   这里测试改成1

创建mysql-proxy 的配置文件

  1. [mysql-proxy]
  2. user=root              #运行mysql-proxy用户
  3. admin-username=lin3615      #主从mysql共有的用户
  4. admin-password=123456       #用户的密码
  5. proxy-address=192.168.1.8:4040 #mysql-proxy运行ip和端口,不加端口,默认4040
  6. proxy-read-only-backend-addresses=192.168.1.7 #指定后端从slave读取数据
  7. proxy-backend-addresses=192.168.1.6 #指定后端主master写入数据
  8. proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定读写分离配置文件位置
  9. admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理脚本
  10. log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
  11. log-level=info #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
  12. daemon=true #以守护进程方式运行
  13. keepalive=true #mysql-proxy崩溃时,尝试重启
  14.  
  1. 修改 文件权限 chmod 660 /etc/mysql-porxy.cnf

启动mysql-proxy --》[root@192 bin]# ./mysql-proxy --defaults-file=/opt/mysql-proxy/bin/mysql-proxy.conf

查看日志

启动时候由于会占用编辑界面 此时 再次启动会报错

netstat -tupln |grep mysql    查看mysql 占用的网络端口

为了验证是否配置成功  关闭从服务器 slave    从服务器中数据没有被更新

疑问?? 关闭了同步   insert 的数据 没有 进入 从数据库中  但是通过 mysql-proxy 代理服务器 查询  确能查询到 新增数据 ?

推测 代理服务器有验证 消息同步  如果没有同步 则会从主数据库查询

 

mysql 优化 读写分离 主从复制的更多相关文章

  1. 八,mysql优化——读写分离

    读写分离目的是给大型网站缓解查询压力.

  2. MySQL的读写分离---主从复制、主主复制

    1.复制是基于BinLog日志 存在三种日志格式:Statement:存储Sql语句,存储日志量是最小的.有可能复制不一致Row:存储event数据,存储日志量大,但是不能很直接进行读取:Mixed: ...

  3. 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?

    如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...

  4. MySQL Router实现MySQL的读写分离

    1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...

  5. MySQL的读写分离的几种选择

    MySQL的读写分离的几种选择 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 原址如下: http://heylinux.com/archives/1004. ...

  6. MySQL/MariaDB读写分离配置

    DB读写分离描述 数据库的读写分离其实就是为了加减少数据库的压力:数据库的写入操作由主数据库来进行,读取操作由从数据库来进行操作.实现数据库读写分离技术是有很多方法的,在这里我就用一个比较简单的mys ...

  7. Amoeba搞定mysql主从读写分离

    前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...

  8. Centos7源码安装mysql及读写分离,互为主从

       Linux服务器 -源码安装mysql 及读写分离,互为主从   一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...

  9. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

随机推荐

  1. 【死磕Java并发】—–J.U.C之AQS(一篇就够了)

    [隐藏目录] 1 独占式 1.1 独占式同步状态获取 1.2 独占式获取响应中断 1.3 独占式超时获取 1.4 独占式同步状态释放 2 共享式 2.1 共享式同步状态获取 2.2 共享式同步状态释放 ...

  2. [Angular Unit Testing] Shallow Pipe Testing

    import { TestBed, ComponentFixture } from '@angular/core/testing'; import { BrowserDynamicTestingMod ...

  3. 【25.33%】【codeforces 552D】Vanya and Triangles

    time limit per test4 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  4. [Angular] Scrolling the Message List To the Bottom Automatically Using OnChanges

    Let's say the message list can Input (messages) from parent component, and what we want to do is whe ...

  5. Ajax请求Session超时的解决办法:拦截器 + 封装jquery的post方法

    目标:前端系统,后端系统等,统一处理Session超时和系统错误的问题. 可能需要处理的问题:Session超时.系统500错误.普通的业务错误.权限不足. 同步请求:            Sess ...

  6. 【14.94%】【codeforces 611E】New Year and Three Musketeers

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. 【38.46%】【codeforces 615E】Hexagons

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  8. ANDROID L——RecyclerView,CardView进口和使用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 这篇文章是ANDROID L--Material Design具体解释(UI控 ...

  9. python去噪算法

    <programming computer vision with python >中denoise 算法有误,从网上好了可用的代码贴上,以便以后使用. 书中错误的代码: def deno ...

  10. C# 异步和多线程

    C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开 ...