MySQL 常见SQL优化、索引优化

索引优化

索引区分度

前言

索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多)

针对列的值,从左往右截取部分来建立索引(前缀索引

  1. 截的越短,重复度越高,区分度越小,索引效果越差。
  2. 截的越长,重复度越低,区分度越大,索引效果越好。但是需要更多的空间存储索引文件。增删改变慢。

所以我们需要在区分度 / 长度两者间取得一个平衡。我们可以截取不同的长度,并测试其区分度。

公式

单列区分度计算:select count(distinct (列名))/ count(*) from table; 获取单列最大区分度
索引区分度计算:select count(distinct left(列名,截取长度))/ count(*) from table; 计算指定索引长度区分度

区分度值位于 0.0000~1.0000 之间,该值越大即该字段的区分度越大!
char,varchar类型,length 可以小于字段实际长度;如果是 blog和 text类型,必须指定 length.

演示
区分度计算
占用差
索引建立

优先采用区分度高的列建立索引,索引列截取长度可适当延长一定范围

常见计算规则
  1. 不同的字符集(表的字符集),一个字符占用的字节数不同。
    • latin1: 1character = 1byte
    • gbk: 1character = 2byte
    • utf8: 1character = 3byte
    • utf8mb4: 1character = 4byte
  2. 所有的索引字段,如果没有设置not null,则需要加一个字节。
  3. 定长字段,int占四个字节、date占三个字节、char(n)占n个字符。
  4. 对于可变字段varchar(n),则有n个字符+两个字节。
  • char(n) = (Character Set:utf8mb4=4/utf8=3/gbk=2/latin1=1) * n(列长度) + 1(允许null)
  • varchar(n) = (Character Set:utf8mb4=4/utf8=3/gbk=2/latin1=1) * n(列长度) + 2(固定值) + 1(允许null)

未完待续

SQL优化

  • 待写作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近项目刚刚上线,所以有时间对项目进行优化,索引首当其冲,但自己对数据库这方面知识了解很少,只能网上学习,发现了一...
    内沐阅读 159评论 0 0
  • 之前的文章一直在规避索引的建立去优化数据库,不是不想讲,而是这个太重要,必须抽出来讲。今天我们就来研究下数据库索引...
    sherlock_6981阅读 3,024评论 0 23
  • 第一章 总则 第1条 目的及适用范围 规范生产环境数据库设计,统一数据库设计标准。避免设计不合理造成重复犯错。 适...
    今天要开心鸭阅读 504评论 0 0
  • 参考资料:极客时间《MySQL实战45讲》 1 基础架构 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支...
    IM后海大鲨鱼阅读 735评论 0 0
  • MySQL 官方对索引(Index)的定义是存储引擎用于快速查找记录的一种数据结构。(1)索引是物理数据页,数据库...
    四街的1024阅读 185评论 0 0