mysql 优化 读写分离 主从复制
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 再次查询

配置主从依赖 再 从服务器上输入
change master to
master_host='192.168.1.6', #表示主服务器地址
master_user='root',
master_password='root',
master_log_file='mysql-bin.000001', #日志文件名
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 的配置文件
[mysql-proxy]
user=root #运行mysql-proxy用户
admin-username=lin3615 #主从mysql共有的用户
admin-password=123456 #用户的密码
proxy-address=192.168.1.8:4040 #mysql-proxy运行ip和端口,不加端口,默认4040
proxy-read-only-backend-addresses=192.168.1.7 #指定后端从slave读取数据
proxy-backend-addresses=192.168.1.6 #指定后端主master写入数据
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定读写分离配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=info #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
daemon=true #以守护进程方式运行
keepalive=true #mysql-proxy崩溃时,尝试重启
修改 文件权限 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 优化 读写分离 主从复制的更多相关文章
- 八,mysql优化——读写分离
读写分离目的是给大型网站缓解查询压力.
- MySQL的读写分离---主从复制、主主复制
1.复制是基于BinLog日志 存在三种日志格式:Statement:存储Sql语句,存储日志量是最小的.有可能复制不一致Row:存储event数据,存储日志量大,但是不能很直接进行读取:Mixed: ...
- 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?
如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...
- MySQL Router实现MySQL的读写分离
1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...
- MySQL的读写分离的几种选择
MySQL的读写分离的几种选择 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 原址如下: http://heylinux.com/archives/1004. ...
- MySQL/MariaDB读写分离配置
DB读写分离描述 数据库的读写分离其实就是为了加减少数据库的压力:数据库的写入操作由主数据库来进行,读取操作由从数据库来进行操作.实现数据库读写分离技术是有很多方法的,在这里我就用一个比较简单的mys ...
- Amoeba搞定mysql主从读写分离
前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...
- Centos7源码安装mysql及读写分离,互为主从
Linux服务器 -源码安装mysql 及读写分离,互为主从 一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
随机推荐
- Linux中LVM2原理及制作LVM2
Linux中LVM2原理及制作LVM2 一.LVM原理 [MD]:Multi Device 多设备 Mdadm是一个用户空间工具,是RAID的管理工具,与真正的RAID工作没有太大关系.真正的RAID ...
- js课程 1-2 js概念
js课程 1-2 js概念 一.总结 一句话总结:js标签元素也是js对象,有属性和方法,方法就是事件,属性就是标签属性,可以直接调用. 1.js中如何获取标签对象? getElement获取的是标 ...
- Snmp常用oid
http://blog.csdn.net/youngqj/article/details/7311849 系统参数(1.3.6.1.2.1.1) OID 描述 备注 请求方式 .1.3.6.1.2 ...
- 深入理解JVM:垃圾收集器与内存分配策略
堆里面存放着Java世界差点儿全部的对象实例,垃圾收集器在对堆进行回收前.第一件事情就是要确定这些对象之中哪些还存活,哪些已经死去.推断对象的生命周期是否结束有下面几种方法 引用计数法 详细操作是给对 ...
- NET中的System.Transactions(分布式事务)
NET中的System.Transactions(分布式事务),当项目开发完成以后,调用的时候遇到了MSDTC的问题,在查阅了相关资料后将这个问题解决了,大致的问题主要是使用了分布式事务,而无法访问到 ...
- Android BlueDroid(一):BlueDroid概述
关键词:bluedroid bluez作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢!)欢迎指正错误.共同学习.共同进步!! 一.名词解释:(实用信息添加中--) BTI F: ...
- 树莓派——root用户和sudo
Linux操作系统是一个多用户操作系统,它同意多个用户登录和使用一台计算机. 为了保护计算机(和其它用户的隐私).用户都被限制了能做的事情. 大多数用户都同意执行计算机上大部分程序,而且编辑和保存存放 ...
- 递归(c++)(转)
1.什么是递归函数(recursive function) 递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身. 例如,下面的程序为求n!: long fact(i ...
- RPC与REST的差别
一:RPC RPC 即远程过程调用, 非常easy的概念, 像调用本地服务(方法)一样调用server的服务(方法). 通常的实现有 XML-RPC , JSON-RPC , 通信方式基本同样, 所不 ...
- 【BZOJ 1017】 [JSOI2008]魔兽地图DotR
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1017 [题意] [题解] 设f[i][j][k] 表示第i个节点以下的总花费为j, 然 ...