当前位置: 首页 > news >正文

mysql优化过程中遇见的坑(mysql优化问题特别注意)

不要听信你看到的关于优化的“绝对真理”,包括本文所讨论的内容,而应该是在实际的业务场景下通过测试来验证你关于执行计划以及响应时间的假设。

  1. 单条查询最后添加 LIMIT 1,停止全表扫描。

  2. 对于char(4) 或者vachar(4),无论是中文还是英文都是存储四个字符,注意是字符而不是字节。

  3. 如果一个字段未int类型,此类型只有0、1两个状态,需要为此建立索引吗?过度索引,影响更新速度,必须在唯一性较高的字段上建立非聚集索引。

  4. 在创建表的时候如果在业务中能保证非null的字段,建议明确标示not null 因为mysql中对null需要特殊的标示。使用not null 字段更节省空间。对接下来的索引构建也有好处。

  5. count() 和count(name) name 代表某个字段,可以为NULL。在mysql中count()会把null统计进去、而count(name) 不会。如果统计的字段中含有null,这个两个统计的结果是不同的。

  6. 在sql语句等号左边用函数,会使该查询在该字段无法使用索引。如LENGTH(str) 函数。

  7. 索引也是需要存储到物理空间的,经常增删的表不适合建太多的索引,因为索引的维护会很耗时间。一张表最多建立15个索引。索引的长度越小越好,索引是有序的。如果查询Max()之类用索引的话,连表都不用查询了,快得飞起。

  8. mysql中null不参与比较运算,name <>'小米' 得出的结果中不包含 name=null的情况。在业务不能保证某字段是否为null的情况,写代码的时候需要注意null的坑。保证取得的数据是对而全,然后再考虑查询速率问题。

  9. MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。

  10. 对整数类型指定宽度,比如INT(11),没有任何卵用。INT使用32位(4个字节)存储空间,那么它的表示范围已经确定,所以INT(1)和INT(20)对于存储和计算是相同的。

  11. UNSIGNED表示不允许负值,大致可以使正数的上限提高一倍。比如TINYINT存储范围是-128 ~ 127,而UNSIGNED TINYINT存储的范围却是0 - 255。

  12. 通常来讲,没有太大的必要使用DECIMAL数据类型。即使是在需要存储财务数据时,仍然可以使用BIGINT。比如需要精确到万分之一,那么可以将数据乘以一百万然后使用BIGINT存储。这样可以避免浮点数计算不准确和DECIMAL精确计算代价高的问题。

  13. TIMESTAMP使用4个字节存储空间,DATETIME使用8个字节存储空间。因而,TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。

  14. schema的列不要太多。原因是存储引擎的API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列,这个转换过程的代价是非常高的。如果列太多而实际使用的列又很少的话,有可能会导致CPU占用过高。

  15. 大表ALTER TABLE非常耗时,MySQL执行大部分修改表结果操作的方法是用新的结构创建一个张空表,从旧表中查出所有的数据插入新表,然后再删除旧表。尤其当内存不足而表又很大,而且还有很大索引的情况下,耗时更久。

转载于:https://www.cnblogs.com/jwanqiang/p/11196284.html

相关文章:

  • 模块的查找方法
  • 动态规划——区间DP,计数类DP,数位统计DP
  • javascript基础学习六--原型与继承
  • reboot 示例代码
  • 桥模式
  • k8s高可用
  • kafka笔记博客
  • 开发工具之AltiumDesigner
  • 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?...
  • go guid 和uuid生成
  • 使用策略模式减少if else
  • numpy中的max()函数
  • [NOI2005]聪聪与可可(期望)
  • span底部显示border一半
  • Django之ORM多表操作
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 4. 路由到控制器 - Laravel从零开始教程
  • Apache的基本使用
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Cookie 在前端中的实践
  • httpie使用详解
  • JavaScript设计模式系列一:工厂模式
  • js递归,无限分级树形折叠菜单
  • JS函数式编程 数组部分风格 ES6版
  • Linux Process Manage
  • Linux后台研发超实用命令总结
  • python学习笔记 - ThreadLocal
  • spring + angular 实现导出excel
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里云应用高可用服务公测发布
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从输入URL到页面加载发生了什么
  • 力扣(LeetCode)965
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 配置 PM2 实现代码自动发布
  • 山寨一个 Promise
  • 深度学习中的信息论知识详解
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我的业余项目总结
  • 原生js练习题---第五课
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 【云吞铺子】性能抖动剖析(二)
  • ​​​​​​​​​​​​​​Γ函数
  • # 数据结构
  • #Linux(Source Insight安装及工程建立)
  • (3)STL算法之搜索
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (HAL库版)freeRTOS移植STMF103
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (zt)最盛行的警世狂言(爆笑)
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (五)c52学习之旅-静态数码管