MySQL优化(一)

1. MySQL优化概述

有些系统无法使用memcache作为缓存服务器来提升系统的执行效率。

优化的思路:
存储层(数据): 存储引擎、列类型、范式规范
设计层(单台服务器): 索引、缓存、分区(分表)
架构层(多台服务器): 读写分离(主从复制)
sql语句层: 更合适的sql语句

2. 存储引擎

2.1什么是存储引擎
MySQL中的数据是通过各种不同的技术(格式)存储在文件(或者内存)中的。技术和本身的特性就称为"存储引擎"。
每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的存储引擎,你能够获得不同的速度或者功能,从而改善你的应用的整体功能
2.2 MySQL支持的存储引擎的种类
使用: show engines;

查看数据库中表的存储引擎。、
Show table status from 库名;

2.3 MyISAM引擎
2.3.1创建基于MyISAM引擎的数据表
创建表SQL:
CREATE TABLE user1(
uid INT AUTO_INCREMENT PRIMARY KEY,
uname VARCHAR(20) NOT NULL
)ENGINE=MYISAM DEFAULT CHARSET=utf8;

2.3.2文件结构

2.3.3 MyISAM数据存储顺序

2.3.4 MyISAM数据压缩
随着数据库中的数据量变大,会使SQL的效率降低,如果我们将数据表文件进行压缩,减小文件尺寸,就能够提升SQL效率。


在命令行(cmd.exe)中执行该命令
命令格式: myisampack.exe 数据库文件路径\表名;

压缩之前:

执行压缩:


压缩之后的效果:

重建索引:myisamchk.exe


命令格式: myisamchk.exe -rq 数据库文件路径\表名;


在实际项目中有一些表是建立好之后就不会发生改变了,这样的表就非常适合进行压缩。
例如: 省市区无限分类表
京东商城的商品分类表


解压数据表:myisamchk.exe
命令格式: myisamchk.exe --unpack 数据库文件路径\表名

解压缩之后索引文件还可以继续使用。

2.4 InnoDB引擎
2.4.1创建基于InnoDB的数据表
CREATE TABLE user2(
uid INT PRIMARY KEY,
uname VARCHAR(20) NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

2.4.2 InnoDB文件结构



任何库中的InnoDB数据表的数据和索引文件都存放在该文件中。
2.4.3为InnoDB引擎设置独立存储空间

两种方式修改:
临时修改:SET GLOBAL innodb_file_per_table=1;

永久修改: 修改my.ini文件

2.4.4 InnoDB数据存储顺序

所以在执行插入操作时,InnoDB效率低于MyISAM效率

2.5 MyISAM与InnoDB对比总结
2.5.1 MyISAM和InnoDB对比


2.5.2如何选择MyISAM、InnoDB引擎
1)如果项目对数据的完整性要求不高,偏重SQL的执行效率就选择MyISAM。例如:CMS(内容管理系统), 论坛, 微博, qq空间。
2)项目对数据的完整性要求非常高,必须使用InnoDB。例如:银行系统,财务系统,ERP(企业资源计划),OA, 网上商城。
2.6 其他存储引擎介绍
2.6.1 Memory引擎
数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
2.6.2 archive引擎
归档存储引擎,只支持数据的查询和写入。
经常用于存储日志等相关信息。

3.列类型优化
3.1 为什么要优化列类型
不同的数据类型所用的存储空间不一样,尽量选择占用空间下的类型。
不同的数据类型,SQL的执行效率是不一样的。
3.2 整型数据优化

  1. 人的年龄(unsigned tiny int)、狗的年龄(tinyint)、乌龟的年龄(unsigned smallint)
  2. 京东商城的商品类别id(unsigned smallint)
  3. 华为erp系统的用户id(mediumint)
  4. 优酷会员id(unsigned int)
  5. 新浪的新闻id(int), 会使用备份服务器,来存储之前的数据。
    3.3 字符串类型优化
    Varchar、char、text
    Varchar: 可变类型。 Varchar(20) 存储:abc 实际占用长度3字节。
    Char: 固定长度。 Char(20) 存储:abc 实际占用20字节。

Char的SQL效率更高,varchar效率低,占用空间小

手机号: char(11)
座机号: 3位区号-8位号码 4位区号-8位号码 4位区号-7位号码 char(12)
用户密码: MD5 char(32)。
用户名: varchar(30)
文章标题: varchar(30)
文章摘要: varchar(255)
3.4 时间类型优化
1)date datetime 等
2)unsigned int
经常参数预算的时间类型,建议使用整型。
用户注册时间: datetime
用户最后登录时间: unsigned int

unix_timestamp() 将字符串日期转换为unix时间戳
from_unixtime() 将unix时间戳转换为字符串日期

3.5 枚举类型与集合类型(复合类型的数据)
Enum(枚举): 单选。
Set(集合): 多选。

能够使用枚举或者集合,一定不要使用字符串。

Sex: 使用枚举。
Hobby: 使用集合。

在底层,枚举和集合是整型保存。
3.6 IP类型数据的存储
ip: 202.145.178.196 最长的ip
使用函数将字符串转为整型:

mysql: inet_aton(ip) ip转整型 inet_ntoa(数字) 整型转ip
php: ip2long(ip) ip转整型 long2ip(数字) 整型转ip



封用户名:
封IP :使用inet_aton将ip地址转为整型保存。

3.7尽量使用 not null
除非你有一个非常特殊的需求,否则一定要加 not null属性。 允许空比非空占用的空间更大,允许空字段在执行sql时,会执行更复杂的运算。
最好再加上 default。
3.8 字段类型使用总结
1)整型: 在满足需求的情况下,尽量选择小类型。
2)能用整型就不用字符串: 枚举、集合来代替字符串,保存ip地址时将字符串转为整型
3)在使用字符串时,固定长度一定选择char;可变长度,尽量减小长度。
4)时间类型,参与运算比较多的采用int,不参与运算的采用date、datetime等。
Unix_timestamp() 将字符串时间转为时间戳
From_unixtime() 将时间戳转为字符串时间
5)尽量使用 not null。

4.设计范式
人们在长期设计数据库工作中总结出来的数据库设计的原则。
4.1 第一范式(确保每列保持原子性)
示例:

问题: 统计全国所有省份的用户数量。

更好的方法就是讲 省 市 区 独立成单独的字段
4.2 第二范式(确保表中的每列都和主键相关)

问题:商品名称、单位、价格这三个字段是不需要的
客户、所属单位、联系方式这三个字段,应该使用客户编号来代替。

客户、所属单位、联系方式三个字段无法和主键联系起来

Order表中: 使用 订单编号和商品编号作为复合主键

4.3 第三范式(确保每列都和主键列直接相关,而不是间接相关)

客户表:
cid cname ctel cemail …

商品表:
gid gname price unit …

订单表:
oid C_id G_id num

4.4 逆范式(违反三范式所定义的原则)
在实际项目中,设计数据表时,可以根据用户操作习惯,系统的实际要求来违反三范式的设计原则。

tel字段不是原子性的,用户在实际操作中必须看到“区号-主号”的形式。
购物车:
id c_id g_id num gname price
增加了 gname、price字段,让SQL查询由原来的多表操作变为单表操作。 单表操作快于多表操作。

假设购物车表中有 1000万条数据,商品表中有1000万条数据。

假设购物车表中300条数据,商品表中有300条数据。

4.5 总结
1)新手阶段时,严格按照三范式的原则。
2)高手阶段,根据经验来设计数据表结构。

学习笔记_mysql(一)相关推荐

  1. mysql初体验学习笔记_MySQL数据库初体验

    克隆表,将数据表的数据记录生成到新的表中 方法一: create table test01 like GCC01; #通过 LIKE 方法,复制GCC01表结构生成test01表 insert int ...

  2. MySQL8单表记录多少_mysql学习笔记之8(单表数据记录查询)_mysql

    mysql学习笔记之八(单表数据记录查询) 查询数据记录,就是指从数据库对象中获取所要求的数据记录.mysql中提供了各种不同方式的数据查询方法. 一.简单数据记录查询 select field1,f ...

  3. ci mysql 事务_MySQL事务-学习笔记

    MySQL事务-学习笔记 MySQL事务 事务的意义 案例:银行转账过程 A向B转账500,A原来有1000,B有500. 分析: SQL处理过程: A 减少 500 B 增加 500 以上两点必须同 ...

  4. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  5. mysql 加号的作用_MySQL学习笔记(一)

    MySQL学习笔记(一) 作者:易成勇 案例来源:AI技术前线 MySQL常用命令 1.查看当前所有数据库 show databases; 2.打开指定的库 use 库名 3.查看当前库的所有表 sh ...

  6. mysql没法修改数据_MySQL学习笔记之数据的增、删、改实现方法

    本文实例讲述了MySQL学习笔记之数据的增.删.改实现方法.分享给大家供大家参考,具体如下: 一.增加数据 插入代码格式: insert into 表明 [列名-] values (值-) creat ...

  7. mysql分页概念_MySQL学习笔记之数据定义表约束,分页方法总结

    本文实例讲述了MySQL学习笔记之数据定义表约束,分页方法.分享给大家供大家参考,具体如下: 1. primary key 主键 特点:主键是用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能 ...

  8. mysql新增表字段回滚_MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  9. mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务

    逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...

最新文章

  1. 移动端rem屏幕设置
  2. Mybatis的一对一查询以及延迟加载
  3. SQLserver模糊查询
  4. 【剑指offer - C++/Java】4、重建二叉树
  5. 哪个类型的B端产品经理有前景?
  6. 两个线程能在cpu中同时运行吗_多核和多线程那些事
  7. 山东工商学院 计算机科学与技术,实验中心-山东工商学院计算机科学与技术学院...
  8. RHCSA8考试-root密码破解
  9. html文件嵌入到reportlab,Django Reportlab使用HTML
  10. 因子分析python代码_用Python实现因子分析
  11. cad等比例缩放快捷键_CAD比例缩放怎么用,快捷键命令SCALE
  12. 计算机不显示验证码,为什么验证码不显示,验证码显示不出来
  13. ❤520给她准备的情人节礼物~html+css+javascript漫天飞雪3D相册(含音乐)
  14. Joyful Pandas--综合练习
  15. python自动视频剪辑_python剪切视频与合并视频的实现
  16. win7计算机管理中看不到新加的硬盘,win7系统看不到第二块硬盘的解决方法.
  17. 解析春运玄学:携程飞猪去哪儿们的抢票加速包,到底灵不灵?
  18. UltraLight 卡存储结构
  19. 知名密码管理应用LastPass启用双因素认证
  20. H5开发使用 “navigationStyle“: “custom“,但是最外层的title标题显示不正确

热门文章

  1. iphone develop tips
  2. 无人驾驶感知篇之融合(十四)
  3. 【Excel进阶】常用的50个函数与基础操作
  4. 一站式地图服务平台“地图易”——平台架构解析
  5. ecshop 商城开发
  6. bilibili(b站)升级到BV号了,还想用av号怎么办?
  7. Python 爬虫进阶必备 | 关于某租房网站数据加密的分析(送两本 Python 书)
  8. 医疗大数据带来多重“健康红利”
  9. P30-P32:逻辑类型,保留小数的输出,辗转相除法求最大公约数
  10. 使用shell获取IP归属地与运营商信息