mysql优化


Posted in MySQL onApril 06, 2021

数据类型优化

  1. 尽量使用可以正确存储数据的最小数据类型
    更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范围的最小类型
  2. 整型比字符操作代价更低
    因为字符集和校对规则使字符比较比整型比较更复杂
  3. 经常查询的列,应该尽量避免使用有null
    如果查询中包含可为NULL的列,对mysql来说很难优化,因为可为null的列使得索引、索引统计和值比较都更加复杂,坦白来说,通常情况下null的列改为not null带来的性能提升比较小,所有没有必要将所有的表的schema进行修改,但是应该尽量避免设计成可为null的列
  4. 尽量使用满足需求的最小数据类型
    TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。
  5. 选择合适的字符/字符串类型
    查询速度:char>varchar>text
    • char长度固定,即每条数据占用等长字节空间;最大长度是255个字符,适合用在身份证号、手机号等定长字符串。char在存储时,会自动删除末尾的空格。检索效率、写效率会比varchar高,以空间换时间
    • varchar可变程度,可以设置最大长度;最大空间是65535个字节,适合用在长度可变的属性。varchar在mysql5.6之前变更长度,或者从255一下变更到255以上时时,都会导致锁表。
    • text不设置长度,当不知道属性的最大长度时,适合用text
  6. datetime和timestamp
    • 不要使用字符串类型来存储日期时间数据
    • 日期时间类型通常比字符串占用的存储空间小
    • 日期时间类型在进行查找过滤时可以利用日期来进行比对
    • 日期时间类型还有着丰富的处理函数,可以方便的对时间类型进行日期计算
    • 使用int存储日期时间不如使用timestamp类型
  7. 使用枚举代替字符串类型
    有时可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表
  8. 特殊类型数据
    人们经常使用varchar(15)来存储ip地址,然而,它的本质是32位无符号整数不是字符串,可以使用INET_ATON()和INET_NTOA函数在这两种表示方法之间转换

主键的选择

主键应该尽量选择自增组件,这样可以减少B+树的页分裂合并

字符集的选择

字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。

  1. 纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间。
  2. 如果我们可以确定不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,这回造成大量的存储空间浪费。
  3. MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作次数并提高缓存命中率。

适当拆分

当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率。

适当的数据冗余

对于被频繁引用且只能通过 Join 2张(或者更多)大表的方式才能得到的独立小字段,由于每次Join仅仅只是为了取得某个小字段的值,Join到的记录又大,会造成大量不必要的 IO,完全可以通过空间换取时间的方式来优化。不过,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新。

索引优化

  1. 使用索引列进行查询时,尽量不要使用表达式,把计算放到业务层实现
  2. 尽量使用主键查询,这样可以避免回表
  3. 使用like时,使用前匹配
  4. 使用索引来进行排序(如果使用组合排序,一个升序一个降序也会使索引排序失效,所以要么全升序,要么全降序)
  5. 组合排序使用索引页应该满足最左匹配
  6. union all、in、or都能使用索引,但是推荐使用in
  7. 范围列可以用索引
  8. 强制类型转换会使用全表扫描
  9. 更新多查询少的数据,不建议使用索引
  10. 数据区分度不高的字段不推荐使用索引
  11. 创建索引的列,不允许为null,可能会得到不符合预期的结果
  12. 单表索引建议控制在5个以内
  13. 但索引字段不允许超过5个
  14. 数据量少时,使用索引有时会效率更低,因为需要回表

sql语句优化

  1. 查询时,不要写select * ,即使需要所有字段,也要把所有列都列举出来。
  2. 只返回一条数据时,使用limit 1
  3. join操作尽量控制在三张表以内
  4. 确保任何的group by和order by中的表达式只涉及到一个表中的列,这样mysql才有可能使用索引来优化这个过程
  5. 尽量使用关联查询代替子查询
  6. 使用分页,当页数较多时,采用join的方式先查询id再进行关联,可以提高效率
  7. 除非必须消除重复行,否则使用union all代替union
  8. 内连接效率要高于外连接
MySQL 相关文章推荐
mysql死锁和分库分表问题详解
Apr 16 MySQL
Mysql服务添加 iptables防火墙策略的方案
Apr 29 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
MYSQL 运算符总结
Nov 11 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
Windows10下安装MySQL8
Mysql 如何批量插入数据
Apr 06 #MySQL
MySQL之DML语言
Apr 05 #MySQL
多属性、多分类MySQL模式设计
Apr 05 #MySQL
多表查询、事务、DCL
Mysql Show Profile
Apr 05 #MySQL
Mysql - 常用函数 每天积极向上
Apr 05 #MySQL
You might like
php的curl实现get和post的代码
2008/08/23 PHP
PHP 防恶意刷新实现代码
2010/05/16 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python实现网页链接提取的方法分享
2014/02/25 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
pandas中的series数据类型详解
2019/07/06 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
园林设计师自荐信
2013/11/18 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
销售经理工作检讨书
2015/02/19 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
关于幸福的感言
2015/08/03 职场文书
企业法律事务工作总结
2015/08/11 职场文书