|10分钟掌握MySQL的索引查询优化技巧


本文的内容是总结一些MySQL的常见使用技巧 , 以供没有DBA的团队参考 。 如无特殊说明 , 存储引擎以InnoDB为准 。
【|10分钟掌握MySQL的索引查询优化技巧】MySQL的特点
了解MySQL的特点有助于更好的使用MySQL , MySQL和其它常见数据库最大的不同在于存在存储引擎这个概念 , 存储引擎负责存储和读取数据 。 不同的存储引擎具有不同的特点 , 用户可以根据业务的特点选择适合的存储引擎 , 甚至是开发一个新的引擎 。
MySQL的逻辑架构大致如下:
|10分钟掌握MySQL的索引查询优化技巧
本文插图

MySQL默认的存储引擎是InnoDB , 该存储引擎的主要特点是:

  • 支持事务处理
  • 支持行级锁
  • 数据存储在表空间中 , 表空间由一些列数据文件组成
  • 采用MVVC(多版本并发控制)机制实现高并发
  • 表基于主键的聚簇索引建立
  • 支持热备份
其它常见存储引擎特点概述:
  • MyISAM:老版本MySQL的默认引擎 , 不支持事务和行级锁 , 开发者可以手动控制表锁;支持全文索引;崩溃后无法安全恢复;支持压缩表 , 压缩表数据不可修改 , 但占用空间较少 , 可以提高查询性能
  • Archive:只支持Insert和Select , 批量插入很快 , 通过全表扫描查询数据
  • SCV:把一个SCV文件当做一个表处理
  • Memory:数据存储在内存中
还有很多 , 不再一一列举 。
数据类型优化
选择数据类型的原则:
  • 选择占用空间小的数据类型
  • 选择简单的类型
  • 避免不必要的可空列
占用空间小的类型更节省硬件资源 , 如磁盘、内存和CPU 。 尽量使用简单的类型 , 如能用int就不用char , 因为后者的排序涉及到字符集的选择 , 比使用int复杂 。 可空列使用更多的存储空间 , 如果在可空列上创建索引 , MySQL需要额外的字节做记录 。 创建表时 , 默认都是可空 , 容易被开发者忽视 , 最好是手动改为不可空 , 如果要存储的数据确实不会有空值的话 。
整型类型
整型类型包括:
  • tinyint
  • smallint
  • mediumint
  • int
  • bigint
它们分别使用8、16、24、32和64位存储数字 , 它们可以表示
|10分钟掌握MySQL的索引查询优化技巧
本文插图

范围的数字 , 前面可以加unsigned修饰 , 这样可以让正数的可表示范围提高1倍 , 但是无法表示负数 。 另外 , 为整型指定长度没什么卵用 , 数据类型定下来 , 长度也就相应定下来了 。
小数类型
  • float
  • double
  • decimal
float和double就是通常意义上的float和double , 前者使用32位存储数据 , 后者使用64位存储数据 , 和整型一样 , 为它们指定长度没什么卵用 。
decimal类型比较复杂 , 支持精确计算 , 占用的空间也大 , decimal使用每4个字节表示9个数字 , 如decimal(18,9)表示数字长度是18 , 其中小数位9个数字 , 整数部分9个数字 , 加上小数点本身 , 共占用9个字节 。 考虑到decimal占用空间较多 , 以及精度计算很复杂 , 数据量大的时候可以考虑用bigint代替之 , 可以在持久化和读取前对真实数据进行一些缩放操作 。
字符串类型
  • varchar
  • char
  • varbinary
  • binary
  • blob
  • text
  • 枚举
varchar类型数据实际占用空间等于字符串的长度加上1个或2个用来记录字符串长度的字节(当row-format没有被设置为fixed时) , varchar很节省空间 。 当表中某列字符串类型的数据长度差别较大时适合使用varchar 。


推荐阅读