Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!

文编|JavaBuild

哈喽,大家好呀!我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加油学习,珍惜现在来之不易的学习时光,等工作之后,你就会发现,想学习真的需要挤时间,厚积薄发啦!

在日常工作中,我们常用的数据库无非是Mysql、Oracle、SqlServer、DB2这几种(仅针对关系型数据库中),对于我们来说,数据库的性能优化是一个重点问题,也是很多公司面试时喜欢提及的,这里总结了一些比较常见,但又相对容易忽略的部分,供大家批判学习。

1、切勿使用select * 进行全表查询

select * 会直接查询出数据表中的全量字段数据,可能很多数据并不需要,白白浪费了数据库资源,并且select * 不会走覆盖索引,可能会出现回表操作,在单表数据量较大情况下,导致sql查询的效率低下。

2、尽量用union all 替代union

union组合查询,可以不获取几张表排重后的数据结果。

union all 是用来获取几张表的全量数据,不会排重,包含重复数据。

在union排重的过程中,需要遍历、排序和比较,耗时耗资源。所以,若非一些不可有重复数据的业务场景外,尽量选择union all。

3、小表驱动大表

何为小表驱动大表?顾名思义,两多表联合查询时,用数据量小的表去驱动数据量大的数据表,譬如:有user和order两张表,order表为100万数据量,user表有100条数据,此时想查一下有效用户下过的订单情况。

有如下两种实现方式:

这两种方式,其实使用in查询的效果更好,因为,执行顺序是先执行in中子查询,然后再执行外面的雨具,此时in中数据量少,查询速度快。

当使用exists时,会优先查询左侧的主查询,然后将查询出的结果和右边的语句进行匹配,用100万条数据与100条数据匹配结果,显然效率会查很多。

这种做一个小总结:

1:in关键字适应于左边大表,右边小表;

2:exists关键字适应于左侧小表,右边大表;


后面我们还会提及的join连接查询,也同样是遵循小表驱动大表规则。

4、用连接查询代替子查询

在Mysql中,如果想通过多张表查询数据,一般会使用子查询或者连接查询的方式进行处理(在Mysql8.0之后支持与Oracle相同的WITH AS语法进行数据分块处理 )

通过in关键字实现的子查询方式,需要先查询出内层语句的结果,作为外层语句的过滤条件使用,在这个过程中子查询会被创建为临时表,查询结束后,删除这些临时表,如果几百上千行的sql中频繁使用的话,会多一些性能损耗。

这时候可以考虑通过连接查询,但是!在《阿里巴巴开发者手册》中对于join的使用数量限制在了3个,当一段sql中频繁使用join的话,会带来索引选择的困难,曾经在工作中,使用一个数据量较大的表进行了6次的left join 最终查询耗时很久。

这里建议大家可以采用多种方式混合使用的方式,先用with as 将核心数据进行一次处理,随后在通过 join进行联接查询,汇总结果。

5、建表时选择合适字段

  1. 能用数字类型,就不用字符串,字符的处理要比数字慢
  2. 满足使用情况下,用小类型,比如bit用来存布尔值,tinyint存枚举值
  3. 长度固定的字符串字段,用char类型
  4. 长度可变字符串用varchar类型
  5. 金额字段用decimal,避免精度丢失

Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!的更多相关文章

  1. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  2. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  3. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  4. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  5. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  6. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  8. MYSQL性能优化的最佳20+条经验

    MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论  131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...

  9. [MySQL性能优化系列]LIMIT语句优化

    1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...

  10. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

随机推荐

  1. Django-rest-framework框架——路由组件、认证权限频率

    @ 目录 一 路由Routers 1.1 使用方法 1.2 代码演示 1.2 视图集中附加action的声明 1.3 路由router形成URL的方式 认证权限频率 一 认证Authenticatio ...

  2. Langchain-Chatchat项目:1-整体介绍

      基于Langchain与ChatGLM等语言模型的本地知识库问答应用实现.项目中默认LLM模型改为THUDM/chatglm2-6b[2],默认Embedding模型改为moka-ai/m3e-b ...

  3. python - view() + UpsamplingBilinear2d()

    import torch from torch import nn # view函数的-1参数的作用在于基于另一参数,自动计算该维度的大小 # view的第一个参数:2 代表的是batch 后面的2, ...

  4. [CISCN 2019华东南]Web11

    看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...

  5. poj2279

    Mr. Young's Picture Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5841   ...

  6. Substring of Sorted String 题解

    Substring of Sorted String 写篇题解纪念一下蒟蒻第一次赛时切出的 F 题. 题目简述 对一个字符串进行单点修改,区间判断操作. 修改操作为将一个字符修改为另一个,判断操作为判 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (119)-- 算法导论10.3 4题

    四.用go语言,我们往往希望双向链表的所有元素在存储器中保持紧凑,例如,在多数组表示中占用前m 个下标位置.(在页式虚拟存储的计算环境下,即为这种情况.)假设除指向链表本身的指针外没有其他指针指向该链 ...

  8. 使用Blazor构建投资回报计算器

    本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本博客中创建的投资计算器根据存入金额和回报率计算每个投资周期的特定回报 ...

  9. 利用Zip.js压缩并上传文件,后端使用.Net(Winform)接收转存

    没时间解释了,快上车... 前端js: upload=function () { if(window.FormData) { var fileslist=$("input[type='fil ...

  10. .NET8:快速集成Rapid.NET三维控件

    .NET8正式版本发布了,AnyCAD Rapid.NET针对.NET8进行了升级和优化.本文以WPF项目为例介绍在.NET8中使用AnyCAD Rapid.NET三维控件. 1 从.NET6升级 若 ...