一文总结高并发大数据量下MySQL开发规范【军规】

在互联网公司中,MySQL是使用最多的数据库,那么在并发量大、数据量大的互联网业务中,如果高效的使用MySQL才能保证服务的稳定呢?根据本人多年运维管理经验的总结,梳理了一些核心的开发规范,希望能给大家带来一些帮助。

一、基础规范

二、库表设计

问题:使用VARCHAR(5) 和VARCHAR(200) 存储’hello’的磁盘空间开销是一样的,使用更短的列有什么优势吗?

更大的定义列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表进行排序或操作时会特别糟糕

三、索引设计

基本规则:索引不是越多越好,能不添加的索引尽量不要添加,过多的索引会严重降低数据插入和更新的效率,并带来更多的读写冲突和死锁!

示例:假设在表tab中id建立了索引

  • Select col_A,col_B from tab where id + 1 > 10001 不会使用索引
  • Select col_A,col_B from tab where id > 10001 – 1 会使用索引

四、SQL优化

  • 线上尽量少使用大SQL,可能一条大SQL就把整个数据库堵死,将复杂SQL拆分为多条简单SQL,化繁为简

  • 一条SQL只能在一个CPU上运算,如果SQL比较复杂执行效率会非常低【8.0之后开始支持单SQL多CPU核执行,但是效果有限】

  • 简单SQL缓存命中率更高
  • 减少锁表时间
  • 充分利用多核CPU,提高并发效率

  • 减少MySQL端的数学运算和逻辑判断,避免SQL语句出现md5()、order by rand()等

  • 尽量少用SELECT * ,只取需要的数据列, 避免无谓的IO、CPU和网络开销
  • WHERE条件中,同一字段改写OR为IN(),IN包含的值不应过多,默认不超过200个,IN里禁止使用子查询
  • 过滤表记录合并且不去重的情况,改写UNION为UNION ALL
  • 减少使用拼接SQL,使用预编译语句,降低SQL注入概率
  • WHERE条件中的非等值条件(IN、BETWEEN、
  • WHERE条件比较,字段类型和传入值必须保证类型一致,避免隐式转换

示例:

字段: code varchar(50) NOT NULL COMENT ‘编码’ #code上建立了索引

SELECT id,name,addr from tab_name where code=10001; 不会使用索引

SELECT id,name,addr from tab_name where code=’10001′; 会使用索引

  • Limit分页优化

  • 传统分页:

Select * from table limit 10000,10;

LIMIT原理:

Limit 10000,10 偏移量越大则越慢

  • 推荐分页:

  • 分页方式一:

Select * from table WHERE id>=23423 limit 11; #10+1 (每页10条)

Select * from table WHERE id>=23434 limit 11;

  • 分页方式二:

Select * from table WHERE id >= ( select id from table limit 10000,1 ) limit 10;

  • 分页方式三:

Select * from table INNER JOIN (SELECT id from table limit 10000,10) USING(id)

  • 分页方式四:

  • 程序取ID: Select id from table limit 10000,10;

  • Select * from table WHERE ID in(123,456…);

最后说明:

上述规范是多年MySQL数据库使用的经验总结,希望能给大家带来一些启发和帮助!

如果你还想看更多优质原创文章,欢迎关注我的公众号「数据库架构师」,提升数据库技能。

Original: https://www.cnblogs.com/databasepub/p/16478997.html
Author: 数据库架构师
Title: 一文总结高并发大数据量下MySQL开发规范【军规】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715285/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【转】App Extension

    原文网址:App Extension – FMDN – 博客园 (cnblogs.com) Today extensions (今日扩展): Today e…

    技术杂谈 2023年6月1日
    0103
  • Crp(customizable route planning) 算法介绍

    作者 crp 算法由微软硅谷研究院三名工程师于2013年提出。 设计目标 应用于大陆级别的实际路网数据 支持任意类型metric(可以理解为cost function) 响应时间满…

    技术杂谈 2023年5月30日
    0104
  • 通俗易懂讲枚举

    枚举使用关键字 enum 进行定义,每个元素都是一个实例,如下,FOO 和 BAR 都是一个 EnumClazz 实例。 public enum EnumClazz { FOO, …

    技术杂谈 2023年7月25日
    096
  • js引入时的三种方式

    javascript;gutter:true; Document</p> <pre><code>alert('沙漠骆驼');…

    技术杂谈 2023年5月31日
    0104
  • Aerospike 安装

    Aerospike 安装 posted on2022-02-09 17:42 duanxz 阅读(65 ) 评论() 编辑 Original: https://www.cnblog…

    技术杂谈 2023年5月30日
    0103
  • 使用 MicroK8s 和 OpenEBS 扩展 Kubernetes 存储

    OpenEBS 由 CloudByte 研发,这是一家专业做容器化存储的公司,OpenEBS 是其一款开源产品,CloudByte 将其在企业级容器存储的经验付诸到该项目中。这个项…

    技术杂谈 2023年5月31日
    097
  • 通俗易懂讲反射

    可进入本人语雀文档看,格式更清晰明了哦https://www.yuque.com/docs/share/3c013ec6-6c35-4854-aaf6-ff9a6e8a6af2?#…

    技术杂谈 2023年7月25日
    093
  • gcc -g -o objdump & nm & addr2line ar & objcopy & readelf & gprof

    -O设置一共有五种:-O0、-O1、-O2、-O3和-Os。你只能在/etc/make.conf里面设置其中的一种。 除了-O0以外,每一个-O设置都会多启用几个选项,请查阅gcc…

    技术杂谈 2023年5月31日
    066
  • 单调栈

    栈 栈是 OI 中常用的一种线性数据结构。 栈的修改是按照后进先出的原则进行的,因此栈通常被称为是后进先出(last in first out)表,简称 LIFO 表。 下文均使用…

    技术杂谈 2023年7月23日
    081
  • Dockerfile 使用 SSH docker build

    如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 文件配置 为了使得 Dockerfi…

    技术杂谈 2023年7月10日
    0101
  • NOI2022 题解合集

    视 (n, q, C_l, C_m) 同级。 对于操作 1 和 2,直接用栈维护。 但对于操作 4,栈不支持快速合并,因此考虑双端队列启发式合并,则该部分总复杂度 (\mathca…

    技术杂谈 2023年6月21日
    0119
  • mac iterm2配置ssh自动登陆

    下载并安装好iterm2 配置过程: https://blog.csdn.net/hu_feng903/article/details/104077950 https://www….

    技术杂谈 2023年5月31日
    075
  • 规范浅谈

    代码规范这东西网上很容易百度到一堆,除了天下文章一大抄的问题,另外,多数只给了结果,原因没有充分说明,或者非常的纠结于大写小写,一个函数可以写几行的细节。感觉有点容易让新人误入歧途…

    技术杂谈 2023年5月31日
    089
  • Python-装饰器的入门讲解

    小白在学习装饰器时,会遇到一些地方不太理解或者不太清楚,这是因为一开始你就直接撸装饰器的缘故,那么怎样才能将装饰器理解并且弄懂呢?所以在学装饰器之前必须要弄懂函数的嵌套以及闭包,接…

    技术杂谈 2023年7月25日
    097
  • 微信小程序用vant,dialog弹出框

    官网如下: https://youzan.github.io/vant-weapp/#/dialog 看效果 1、json中引入 "usingComponents&quo…

    技术杂谈 2023年5月31日
    0105
  • 【开发者必看】【push kit】推送服务典型问题合集3

    ​ 【问题描述1】 无法获取 Push Token,如何解决? 【解决方案】 1.检查Push推送API权益是否开启。 2.检查AGC控制台应用的对应信息是否正确。 3.EMUI …

    技术杂谈 2023年5月31日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球