企业级 PHP 高并发解决方案 0x09 MySQL优化

架构844 字

在本文中,并没有实现过程,算是一个提纲,当我们需要对MySQL进行优化的时候,可以通过本篇文章,了解一下,我们要对MySQL进行哪些优化,也算是对MySQL的优化先要有一个总体的认知。

因为如果要将所有的操作过程都放到这篇文章中,估计还没等看完,你就已经睡着了,具体的操作,我会在其他系列的博文中陆续的更新出来。

优化方向

  • 数据表数据类型优化
  • 索引优化
  • SQL 语句优化
  • 存储引擎的优化
  • 数据表结构设计的优化
  • 数据库服务器架构的优化

数据表数据类型优化

在做数据表结构类型优化时,我们需要考虑如下几点:

  • 字段使用什么样的数据类型更合适
  • 字段使用什么样的数据类型性能更快

Int: tinyint、smallint、bigint

在使用Int类型存储值的时候,一定要按需选择,需要对空间、范围进行考虑,比如存储年龄通常是0~120多,所以我们选择一个最小的tinyint类型,如果加上无符号那么最大值是255,足够我们存储年龄,选择smallint或者bigint明显是一种浪费。

char、varchar

char 的空间效率要比 varchar 要好,如果是存储电话号码,固定为11位,这种类似的需求,使用char要更好。

对于varchar存储一些可变的数据,如用户名。

 enum

特性、固定的分类可以使用 enum 存储,效率更快。

一定要是固定的分类,如果将来的分类会变,就不适合使用enum,因为这样我们就需要去修改数据库表结构,扩展性会变得很差。

IP 地址的存储

IP 地址一般会采用字符型来进行存储,但是这种存储方式会带来很大的空间占用,我们可以使用整型来进行存储,PHP为我们提供了转换函数 ip2lang

索引优化

在做索引型优化时,我们需要考虑如下几点:

  • 建立合适的索引
  • 索引在什么场景下效率最高

索引的创建原则

  • 索引不是越多越好,在合适的字段上创建合适的索引,索引本身会影响我们的写操作的速度,并且会占用磁盘空间。
  • 符合索引的前缀原则。

索引的注意事项

  • 符合索引的前缀原则
  • like 查询%的问题
  • 全表扫描优化
  • or 条件索引使用情况
  • 字符串类型索引失效的问题

SQL 语句的优化

  • 优化查询过程中的数据访问

    • 使用Limit
    • 返回列不用 *
  • 优化长难句的查询语句

    • 变复杂为简单
    • 切分查询
    • 分解关联查询
  • 优化特定类型的查询语句

    • 优化count()
    • 优化关联查询
    • 优化子查询
    • 优化 Group by 和 distinct
    • 优化 limit 和 union

存储引擎的优化

  • 尽量使用 InnoDB 存储引擎

数据表结构设计的优化

  • 分区操作

    • 通过特定的策略对数据表进行物理拆分
    • 对用户透明
    • partition by
  • 分库分表

    • 水平拆分
    • 垂直拆分

数据库架构的优化

  • 主从复制
  • 读写分离
  • 双主热备
  • 负载均衡

    • 通过 LVS 的三种基本模式实现负载均衡
    • MyCat 数据库中间件实现负载均衡。
maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见