数据库优化之mysql【转】
1. 优化流程图
mysql优化(主要增加数据库的select查询,让查询速度更快)
2. 优化mysql的方面
主要从以下四个方面去优化mysql
①存储层:如何选择一个数据库引擎,选择合适的字段列类型
②设计层:满足表的三范式,建立适当的索引,分表分区
③sql层:设计出更好的sql语句
④架构层:msyql读写分离
2. 数据库表的引擎
1. 引擎的简介
不同的数据表引擎有不同的存储数据的方式,其索引结构也是不一样的,从而提供不一样的功能.
如:innodb引擎提供事务的功能,myisam引擎就没有
2. 数据库表的引擎的相关的操作
①,查看数据库支持哪些数据表引擎
以后面试基本能够回答myisam和innodb引擎的区别即可
3. myisam引擎和innodb引擎的区别
myisam和innodb引擎的区别:
①innodb引擎支持事务,myisam不支持
②innodb支持行锁,myisam支持表锁
③myisam主要用在高并发的一些网站,innodb主要用在逻辑性(支持事务)比较高的一些网站
修改一个表的引擎的命令
alter table 表名 engine=innodb
4.myisam引擎和innodb引擎生成数据文件的方式
①创建一个myisam的引擎表
打开mysql的安装目录的data目录查看创建的表结构文件:
②innodb引擎
查看mysql的安装目录的data目录,查看表的结构:
它的数据文件(表名.MYD)和数据表的索引文件(表名.MYI)去哪里了?
4. 数据库的备份
mysqldump命令备份数据库:
备份操作(mysqldump):
还原操作:
先建立一个数据库如(db2)
执行还原的命令(mysql)
mysql可视化工具备份和还原:
备份操作:
还原操作:
5. myiam引擎和innodb引擎插入数据的方式(问题)
①myisam引擎表插入数据
②innodb引擎插入同样的数据
总结:
①myisam引擎插入数据的时候没有按照主键的顺序进行插入,内部没有一个排序的操作
②使用innodb插入数据的时候,内部会按照主键进行一定的排序,排序的过程是需要消耗时间和内存的.
所以我们如果要做大批量数据的插入使用myisam的引擎
3. 选择合适的字段类型
1. 选择字段的基本原则
①使用最小的列类型来存储(如能使用tinyint就不要使用int),因为大的数据类型所占用的字节空间会大点,那么检索数据的速度会慢点
②定义一个表的字段类型的时候,建议设置为not null ,因为一个null会占用一个字节的空间,最好设置一个默认的值 如(varchar not null default ''')
③如果一个数值是正型,我们应该把它设置为unsigned,因为无符号型存储的数据量会大点.
2. mysql的字段类型回顾
char(定长字符串类型):占用0-255字符
varchar(变长字符串类型):占用0-65535,还需要1-2字节空间保存数据类型本身
text:基本无限制
date:日期:如2016-09-12
datetime:日期时间:2016-09-12 12:12:12
enum:枚举类型;一般用在单选enum('男','女')
set:集合的数据类型:一般用在多选 set('学代码','吃饭','睡觉');
3. 如何选择字段类型来存储数据
问题1:存储一个时间用什么类型比较好?
建议大家用int?因为使用int类型方便转化为日期或日期时间,也可以方便我们的时间的一个对比查询.
有时候也可以用datatime,这样把数据取出来就不需要在模板中进行转化
问题2:存储一个不确定的数据(如:文章的标题)
这时候使用varchar(20);
因为标题的长度不确定有多长,我们就使用varchar,如果使用char类型来存储,它会占用指定的空间大小,这样浪费空间,而且检索数据的速度也会慢些
如存储md5加密后的密码用char(32),
如手机号11为:char(11)
问题3:mysql中ip和数字的转化
可以使用int来存储我们的ip地址:
php中ip和数字的互相转化:
ip2long('ip address'): 把ip地址转化为数字
long2ip(): 把数字转化为ip地址
4. 建表的三范式
我们平时建表的时候基本都会满足三范式
1. 第一范式(1NF)
第一范式要保证字段的原子性,
如建立一个用户表
id name address
1 小白 广东广州市天河区
2 小黑 广东深圳市宝安区
以上用户表的address字段没有满足第一范式,因为address的值可以进行划分为省,市,详细地址
修改以上表结构为:
id name province city area
1 小白 广东 广州市 天河区
2 小黑 广东 深圳市 宝安区
2. 第二范式(2NF)
第二范式要保证每个字段和主键不可以有传递依赖
订单表:
order_id room_id username card phone
1 202 小白 234553X 13433333333
2 203 小白 234553X 13433333333
以上订单表有个问题,如果一个顾客有多个订单,那么久对应着多条订单记录,就会产生多条同一个用户的相关信息,那么多出来的用户的信息就有数据冗余
改造订单表如下,给用户信息单独来设置一个表
订单表
order_id room _id user_id
1 202 8
2 203 8
用户表
user_id user name card phone
8 小白 234553X 13433333333
3. 第三范式(3NF)
要保证每个字段和主键直接依赖,以上基于第二范式的完成就已经满足我们的第三范式了.
下一个订单要操作的基本表如下:
订单信息表
订单地址
用户信息表
商品信息表
商品优惠券表
商品属性表
商品图片表
商品分类表
5. mysql中的索引
1. 索引简介
生活上的索引:
书本的目录,公交牌,
使用索引的可以加快select查询的速度,但是对我们的写(insert,update,delete)操作效率会有所降低
2. mysql索引的分类
①主键索引 primary key 不能为空 not null 一个表只能有一个主键索引
②唯一索引 unique key 可以为空,一个表可以有多个唯一索引
③普通索引 key 可以为空,一个表可以有多个普通索引
④全文索引 fulltext index (varchar text)(sphinx)
复合索引:多个字段共同组成的索引
3. 索引基本操作
创建索引一般有两种方式
①创建表的时候指定索引(create)
②修改表结构的方式(alter)
①主键索引的增删改
a.主键索引的创建
create table tab_name(
id int not null auto_increment
primary key(id)
)
如果一个字段是自动增长的它必须是主键值,但是主键值不一定非要是自动增长
删除主键索引: alter table tab_name drop primary key
(注意:如果一个主键字段是自动增长的,必须先删除自动增长的属性,才可以继续删除主键)
添加一个主键索引: alter table tab_name add primary key(id)
②普通索引的增删改
create table table_name(
id int not null auto_increment,
name varchar(30) not null default '',
email varchar(30) not null default '';
primary key(id), //主键
unique key(email) , //唯一键
key key_name (name) //普通键
)
修改表的结构索引
唯一的索引的添加
alter table table_name add unique index uni_em (email)
alter table table_name add unique key uni_em (email)
普通索引的添加操作
alter table table_name add key index_name (name)
alter table table_name add index index_name (name)
4. 构造一张大型的数据表
可以进行蠕虫复制
insert into user (username) select username from user
insert into user (username,email) select username,email from user
例,使用主键和不使用主键查询一条记录的测试
①使用主键id=2000000的记录信息
②不使用主键索引进行查询
5.explain分析sql语句的索引使用情况
使用explain可以知道一条sql语句的使用索引的基本情况,只需要在查询语句前面加个explain或者是desc,从而可以更好的优化我们的sql语句
如: explain select * from users where id=200000;
desc select * from users where id=200000;
使用到了主键索引:
没有使用到索引查询,进行了全表扫描
6. 如何正确的使用索引
①进场出现where条件后面的字段,我们就可以把字段设置为索引
给字段no_index设置为普通索引
查看建表语句:
再次可发现使用到了索引:
②模糊查询索引的使用情况
对关键字查询一般有以下两种情况
like '%关键字%' ========> 不会时候到索引
like '关键字%' ========> 使用到索引查询
只要关键字左边有%,就不会使用到索引查询
③使用索引优化order by语句
④,优化分页limit语句
⑤复合索引的最左原则(面试经常问)
只要我们在where条件后查询的字段出现了复合索引的最左边的一个字段,那么其就会使用到索引查询.
先建立一个复合索引
建立一个复合索引,把username,和email字段作为复合索引
alter table users add index index_user_email(username,email);
a.
b.
如果想使用复合索引的后面字段,必须先使用最左边的一个字段
复合索引的索引长度计算:
215=(30+40)*3+2*2(变量类型本身2)+1(null)
utf-8下一个字符占用3个字节
gbk:下一个字符占用2个字节
六.慢日志查询
简介
当一条sql执行比较慢的时候(10秒),我们可以通过mysql的一个慢日志查询的功能可以记录
这条比较慢sql,我们可以定义一个我们认为比较慢(10秒)的sql语句,那么超过十秒钟的sql语句就会被记录下来,从而我们就可以优化我们这个有问题的sql语句
开启慢日志查询
①开启慢日志查询:
②修改mysql的配置文件,加以下两个选项
记得保存,重启mysql服务器.
③,进行测试:
打开慢日志文件如下:
注意:mysql查询的时候,有时候(默认)有缓存,我们可以通过以下配置禁用缓存
查询的时候也可以不查询缓存数据
select sql_no_cache from table_name...............
转自
数据库优化之mysql https://www.toutiao.com/i6501466752893846029/
数据库优化之mysql【转】的更多相关文章
- 《数据库优化》- MySQL视图
一.什么是视图 视图,是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改,视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通俗地讲,视图就 ...
- 50多条mysql数据库优化建议
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...
- mysql数据库优化课程---13、mysql基础操作
mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...
- MySql数据库 优化
MySQL数据库优化方案 Mysql的优化,大体可以分为三部分:索引的优化,sql慢查询的优化,表的优化. 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更 ...
- 数据库介绍以及MySQL数据库的使用
一 数据库介绍 1.1 数据库定义 数据库就是存储数据的仓库 本质上就是一套cs结构的TCP程序 客户端连接到服务器 向服务器发送指令 完成数据的操作 1.2 常见数据库 关系型数据库 就是 ...
- 关于MySQL数据库优化的部分整理
在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...
- 【MySQL】花10分钟阅读下MySQL数据库优化总结
1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
随机推荐
- java 面试 心得
16. ArrayList list = new ArrayList(20);中的list扩充几次() A 0 B 1 C 2 D 3 答案:A 解析:这里有点迷惑人,大家都 ...
- Daily Scrum 11.1
今天放假一天,明天又是新的一周,预计开始Alpha版本所有功能的整合和优化,争取在两天内完成各种功能的整合. Member Task on 11.1 Task on 11.2 仇栋民 放假一天 开始T ...
- 各组Beta版本发布点评
1. 新蜂:俄罗斯方块 俄罗斯方块已经基本完成了所有功能,运行流畅,也加入了之前用户期待的即将降落的方块和游戏积分的功能,用户还能随时暂停和继续游戏. 2. 天天向上: 连连看游戏 连连看游戏在核心 ...
- Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
https://blog.csdn.net/c406495762/article/details/75172850
- kubectl 命令记录 转帖自: https://www.kubernetes.org.cn/doc-45
kubectl annotate – 更新资源的注解. kubectl api-versions – 以“组/版本”的格式输出服务端支持的API版本. kubectl apply – 通过文件名或控制 ...
- 本地安装apk后直接打开,按下Home键再重新打开,然后按下返回键时页面展示错误的处理方法
情景: 1.下载apk到手机本地,点击本地apk开始安装 2.安装完成后,一般会有 “完成” 和 “打开” 两个按钮,点击 “完成” 按钮时是没有问题的,不管它 3.点击 “打开” 按钮,进入到首页( ...
- Hello 2019 自闭记
A:8min才过??? #include<iostream> #include<cstdio> #include<cmath> #include<cstdli ...
- Emacs 安装配置使用教程
Emacs 安装配置使用教程 来源 https://www.jianshu.com/u/a27b97f900f7 序|Preface 先来一篇有趣的简介:Emacs和Vim:神的编辑器和编辑器之神 - ...
- 【BZOJ1414】[ZJOI2009]对称的正方形(哈希)
[BZOJ1414][ZJOI2009]对称的正方形(哈希) 题面 BZOJ 洛谷 题解 深思熟虑一波,发现一个矩阵如果左右对称的话,那么它每行都是一个回文串,同理,如果上下对称的话,那么每列都是一个 ...
- 洛谷 P2671 求和 解题报告
P2671 求和 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\) .每个格子上都染了一种颜色\(color_i\)用\([1,m]\)当中的一个整数表示),并 ...