【mysql】mysql优化
一,表设计
      1.1. E-R(entity relation)实体关系图
            长方形 实体 表
            椭圆形 属性 字段
            菱形 关系 一对一 多对一 属于 多对多
      1.2. 三范式标准
            原子性
                  个人信息
                  省市县乡镇
            唯一性
                  主键 id
            无冗余性
                  订单表中的商品名称与价格应该关联查询商品表
            三范式并不绝对。
      1.3. 选择合适的存储引擎
            查询效率
                  myisam快
                  innodb慢
            事务
                  myisam不支持
                  innodb支持
            全文索引
                  myisam支持
                  innodb不支持
                  兄弟连,研究生命,和特朗普通话,别插嘴。
            锁机制
                  myisam表锁
                        即锁定一张表,如果进行读操作,则其他进程不允许写,如果进行写操作,则其他进程不允许读,更不允许写
                  innodb行锁
                        即锁定一条记录,其他进程可以对其他记录进行读写操作,
            文件存储区别
                  myisam有三个文件
                        .frm
                        .myd
                        .myi
                  innodb有两个文件
                        .frm
                        .idb
              总结
                    查询频繁的使用myisam,例如新闻系统
                    安全性要求高的使用innodb,例如商城系统
  注意: 选择合适的字段类型
            数字->时间->枚举->字符串
            尽量不要使用 null 类型
二,备份
      2.1. 普通备份
            mysqldump -uroot -p123456 database > /tmp/bak.sql
            mysqldump -uroot -p123456  --all-databases --events > /tmp/bak.sql
          计划任务
                linux
                windows
      2.2. 增量备份
            增量备份(incremental backup)是备份的一个类型,备份上一次备份后的所有有变化的文件。
            1. 配置
                  vim /etc/my.cnf
                  log-bin=bin-log
                      开启二进制日志
            2. 查看
                  /usr/local/mysql/data/mysql-bin.000001
                      二进制日志文件位置
                  mysqlbinlog mysql-bin.000001
            3. 恢复
                  (1)通过时间
                        mysqlbinlog --stop-datetime="2017-05-06 06:01:30" mysql-bin.000001 | mysql -uroot -p
                  (2)通过位置
                        mysqlbinlog --stop-position="3068" mysql-bin.000001 |mysql -uroot -p
            4. 重置
                  reset master
            5. 案例
                  CREATE DATABASE lizhaohui;
                  USE lizhaohui;
                  CREATE TABLE users(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL);
                  reset master
                      在创建完库表之后,再执行二进制日志文件记录。
                  INSERT INTO users(name) VALUE('aaaaa');
                  INSERT INTO users(name) VALUE('bbbbb');
                  INSERT INTO users(name) VALUE('ccccc');
                  INSERT INTO users(name) VALUE('ddddd');
                  INSERT INTO users(name) VALUE('eeeee');
                  INSERT INTO users(name) VALUE('fffff');
三,优化
      3.1. 定位慢语句
            vim /etc/my.cnf
              [mysqld]
                  slow-query-log=1   # 开启记录慢查询的操作
                  slow-query-log-file=slow.log  #文件默认存放在mysql的data目录下
                  long-query-time=1  #不能使用小数
            重启 mysql
                  mysqladmin -uroot -p shutdown
                  mysqld_safe -u mysql &
            快速插入数据
                  INSERT INTO users(name) SELECT name FROM users;
      3.2. 处理
            1. 增加,删除,修改
                  查看服务器 cpu 和 内存使用率
                      top命令
                  一张表记录不要超过100万条
                        SELECT COUNT(*) FROM users;
                  检查表索引不宜过多
                        SHOW INDEX FROM users;
                  分库分表
            2. 查询
                  缓存
                  语句分析
                        explain 指令
                              EXPLAIN SELECT * FROM users;
                        type(连接类型)
                              好坏顺序
                                    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
                              system
                              const
                                    表中满足条件的记录最多一条,使用主键或者 唯一索引查询
                                        EXPLAIN SELECT * FROM users WHERE id=1;
                              eq_ref
                                    某一列等于带索引的列
                                        CREATE TABLE IF NOT EXISTS t1(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL, PRIMARY KEY(id))             ENGINE=InnoDB DEFAULT CHARSET=utf8;
                                        CREATE TABLE IF NOT EXISTS t2(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL, PRIMARY KEY(id))             ENGINE=InnoDB DEFAULT CHARSET=utf8;
                                        EXPALIN SELECT * FROM t1, t2 WHERE t1.id = t2.id;
                                        注意:当数据量足够大时,才会出现此连接类型。
                              ref
                                    使用普通索引进行查询
                                        SELECT * FROM users WHERE name = 'admin';
                              ref_or_null
                                    通过普通索引检索,并且会检索null值
                                        EXPLAIN SELECT * FROM users WHERE name = 'amdin' or name = null;
                              range
                                    范围
                                        EXPLAIN SELECT * FROM users WHERE id<3;
                              index
                                    跟all一样,不过只会扫描索引.
                                        EXPLAIN SELECT id FROM users;
                              all
                                    全表扫描
                                        EXPLAIN SELECT * FROM users;
                  索引优化
                        创建
                            主键
                                  CREATE TABLE test(id INT PRIMATY KEY AUTO_INCREMENT,name VARCHAR(50));
                                  ALTER TABLE test ADD PRIMARY KEY(id);
                            普通索引
                                  CREATE TABLE test(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50), INDEX name(name));
                                  ALTER TABLE test ADD INDEX name(name);
                            唯一索引
                                  CREATE TABLE test(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50), UNIQUE name(name));
                                  ALTER TABLE test ADD UNIQUE name(name);
                        删除
                            主键
                                  ALTER TABLE test MODIFY id INT(10);
                                  ALTER TABLE test DROP PRIMARY KEY;
                            非主键
                                  ALTER TABLE test DROP INDEX name;
                        查看
                              SHOW INDEX FROM test;
                          注意:索引,利弊,索引是一把双刃剑。
            多机配置
                  主从
                        好处
                              单向备份
                              读写分离,提高效率
                          原理
实验
                    在主服务器上操作
                        1. 启动binlog日志
                            vi /etc/my.cnf
                        2. 在文件中添加
                            log-bin=mysql-bin
                            server-id=101
                        3. 重启mysql
                            service mysqld restart
                        4. 查看二进制日志是否开启
                            show global variables like '%log%';
                        5. 在 主服务器上 授权
                            grant replication slave on *.* to 'zhang'@'192.168.103.102' identified by '123456';
                        6. 查看主机信息
                            show master status;
                    在从服务器上操作
                        1. 启动binlog日志
                            vi /etc/my.cnf
                        2. 在文件中添加
                            log-bin=mysql-bin
                            server-id=102
                        3. 重启mysql
                            service mysqld restart
                        4. 查看二进制日志是否开启
                            show global variables like '%log%';
                        5. 在 从服务器上 连接
                            change master to master_host='192.168.103.101',master_user='zhang',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=263;
                        6. 启动 sql 线程
                            show slave status\G;
                            start slave;
            主主
                好处
                    双向备份
                    高可用
                    负载均衡
                原理
                    两台机器互为主从
                实验
                    在主服务器上操作
                        1. 启动binlog日志
                            vi /etc/my.cnf
                        2. 在文件中添加
                            log-bin=mysql-bin
                            server-id=101
                            replicate-do-db=test
                            binlog-ignore-db=mysql
                            binlog-ignore-db=information_schema
                            auto-increment-increment=2
                            auto-increment-offset=1
                        3. 重启 mysql
                            service mysqld restart
                        4. 以 101 为主,以 102 为从
                            grant replication slave on *.* to 'zhang'@'192.168.103.102' identified by '123456';
                            show master status;
                            change master to master_host='192.168.103.101',master_user='zhang',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
                        5. 查看 SQL线程
                            show slave status\G;
                            start slave;
                    在从服务器上操作
                        1. 启动binlog日志
                            vi /etc/my.cnf
                        2. 在文件中添加
                            log-bin=mysql-bin
                            server-id=102
                            replicate-do-db=test
                            binlog-ignore-db=mysql
                            binlog-ignore-db=information_schema
                            auto-increment-increment=2
                            auto-increment-offset=2
                        3. 重启 mysql
                            service mysqld restart
                        4. 以 102 为主,以 101 为从
                            grant replication slave on *.* to 'zhang'@'192.168.103.101' identified by '123456';
                            show master status;
                            change master to master_host='192.168.103.102',master_user='zhang',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
                        5. 查看 SQL线程
                            show slave status\G;
                            start slave;
        中文分词。
            sphinx。=> coreseek。
            scws。
【mysql】mysql优化的更多相关文章
- Mysql - 性能优化之子查询
		记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ... 
- Mysql性能优化三(分表、增量备份、还原)
		接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ... 
- Mysql性能优化一
		下一篇:Mysql性能优化二 mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包 ... 
- 关于MySQL数据库优化的部分整理
		在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ... 
- [MySQL性能优化系列]提高缓存命中率
		1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ... 
- [MySQL性能优化系列]巧用索引
		1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ... 
- 【MySQL】花10分钟阅读下MySQL数据库优化总结
		1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ... 
- MySQL性能优化:索引
		MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ... 
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
		1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ... 
- mysql 性能优化方向
		国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ... 
随机推荐
- 5W随想
			什么时候都要想5个W:what.where.when.why.who 比如:提bug的时候:这个问题是什么问题,在哪里发现的,什么时候发现的/什么时候修复好,怎么发现的/为什么是bug,谁发现的/指给 ... 
- R中character和factor的as.integer的不同
			记录一个容易犯错的地方. 用chr标记的0~1变量可以变为整数0和1, 而用因子factor标记的变量转换为整数时总是从1开始. 如果不注意区分就会发生令自己困惑的错误. 
- vue2.0:项目开始,首页入门(main.js,App.vue,importfrom)
			对main.js App.vue 等进行操作: 但是这就出现了一个问题:什么是main.js,他主要干什么用的?App.vue又是干什么用的?main.js 里面的import from又在干嘛?ne ... 
- hive实践_01
			本地一份包含有中文的文本文件在上传到hive前,需要先转化为UTF-8格式,否则会出现乱码.(notepad++ 格式>>>转化UTF-8编码格式) -------------- ... 
- DOTNET CORE源码分析之IOC容器结果获取内容补充
			补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ... 
- 网络安全从入门到精通 (第二章-1) Web安全前端基础
			本文内容: 前端是什么? 前端代码 HTML CSS JS !!!醋成酒的小墨,促成就的小墨,小墨促成就,!!! 1,前端是什么? 网站一般用两部分组成,前端负责展示,后端负责处理请求. 2,前端代码 ... 
- POJ1270 toposort+DFS+回溯
			题目链接:http://poj.org/problem?id=1270 这道题其实就是求所有满足条件的topo序,我们考虑到给定的字符是确定的,也就是他们的长度都是一样的,所以为了得到所有的情况,我们 ... 
- hdu1541树状数组(降维打击)
			题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1541/ 题意是:在二维图上有一系列坐标,其中坐标给出的顺序是:按照y升序排序,如果y值相同则按照x升序排序.这个 ... 
- CERN Root与CLING
			CERN Root on Arch Linux For WSL: 一个CLI才是本体的程序居然有图形启动界面,莫名的微妙感 接触到Root是在一个4chan上喷matlab的thread里.某anon ... 
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测——线段树上bfs求可撤销并查集
			题面 2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 12030 Solved: 6024 Desc ... 
