>[success] ### 第九难 高性能MySQL简介
>[info] ### 从架构层上做优化,可以做分布式
>[info] ### 数据表设计层
* 选择合适的存储引擎(innoDB,MyISAM会使用回行操作)
* 合适的列类型(占用的存储空间尽可能的小),如性别这些可以用tinnyint存储,能固定长度的尽量用固定长度char(因为有时候不可避免的需要用到文件排序filesort,使用变长类型varchar的话会直接使用该列的最大长度,导致资源不必要的消耗)
* 尽量使用符合三范式的表设计结构(原子性:列是最小单元不可分割,唯一性:可以由主键字段来唯一的确定一条记录,依赖性:将一张表拆分为两张由主键字段关联的的表(比如学生表,班级表))
* 根据业务对数据库进行分割:垂直分割(将不同的表拆分到不同的服务器上,如微服务),水平分割(如以学校id取模进行分表)
* 将使用频率不多的字段存放到另外一张表中
* 补充说明: [char与varchar的区别分析](http://www.jb51.net/article/23575.htm)(myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列, innodb 存储引擎 建意使用varchar 类型 )
>[info] ### 索引设计层(索引是一种空间换时间的策略, 在换取时间的同时也有一定的开销, 若索引失当, 可能开销大于收益)
* 对于连接查询所需要的连接的字段,使用索引
* 对于经常出现where条件后的字段与用于排序的字段,使用索引
* 使用复合索引(在排序的时候,如果排序字段跟where条件后的字段分开建立索引,会导致mysql使用where条件后的索引查询出结果,然后再在此结果上使用filesort进行排序;还有where条件后多个单列索引最终会使用到的也只是一个,这个时候按照规则建立复合索引就能加大检索的效率)
* 对于一些列类型比较大的字段,可以使用索引的前缀原则,对其固定长度前缀建立索引(长度较长字段建立索引, 索引文件会比较大, 占用较多磁盘空间的同时, 检索索引的时候对io资源消耗也较大),或者使用一种伪造哈希索引,额外增加一个字段,
作为该大字段的索引,在插入数据的时候,先对需要进行建立伪哈希索引的索引用哈希函数计算出哈希值,再一起存入数据库中。
* 对于修改的比较频繁的字段,尽可能避免建立索引(避免索引树的页分裂)
* 避免冗余索引,比如已经有了一个索引a,现在又建立了一个a,b 那么a索引就是冗余索引,因为a,b 与 a在已a为条件搜索时索引起到的功能是一样的,如果在a字段插入数据的时候,就得同时维护两个索引,造成了不必要的开销
>[info] ### SQL应用层的优化
* 查询了大量的数据,如limit的查询,举个例子,一张有着三百多万条数据的用户表,跟一张和它一样多的用户详情表,现有一个需求,需要查询出每页20条用户,有以下一句sql
select a.username,a.userid,b.face,b.mood,b.date,b.... from user as a inner join user_info as b using userid limit 2500000,10;
再没有带where限制条件的情况下,该语句执行时间达到了30多秒,如果要带上一些排序,那将会产生一个巨大的临时表,将会占用太多的资源
* 使用合理的索引覆盖,分页的情况下使用延迟关联
* 不要连接太多的表(mysql连接查询优化机制是根据每个表的行数,索引来制定查询计划,如果表数量达到8个,那么将会有8 * 7 * 6 * 5 * 4 * 3 * 2 * 1种方式选择,那么mysql制定的查询计划可能就没那么准确)
* 关注执行计划,尽可能的使用到索引,避免扫描过多的行数,避免产生临时表,filesort
- 西天取经(九九八十一难)
- 第一难 WebUpload文件上传
- 第二难 UEditor文本编辑器
- 第三难 ThinkPHP自定义分页模板
- 第四难 VerificationCode验证码
- 第五难 递归 尾递归 迭代 回调
- 第六难 GRPC服务端和客户端
- 第七难 PHP小笔记
- 第八难 yum安装Apache PHP MySQL
- 第九难 高性能MySQL简介
- 第十难 DIV+CSS简介
- 十一难 留言板
- 十二难 正则表达式
- 十三难 PHPMailer邮件发送
- 十四难 日历
- 十五难 百度地图
- 十六难 加密
- 十七难 筛选url跳转
- 十八难 图片转ASCII码图
- 十九难 环境配置
- 二十难 开发工具LiteIDE
- 二一难 开发工具2
- 二二难 准备工作
- 二三难 第一个应用程序 Hello World
- 二四难 语法结构
- 二五难 命名规则
- 二六难 变量
- 二七难 常量
- 二八难 常量计数器 iota
- 二九难 判断语句if
- 三十难 择语句switch
- 三一难 循环语句 for
- 三二难 遍历 range
- 三三难 跳转语句goto, break, continue
- 三四难 make, len, cap, new, nil
- 三五难 数组 array
- 三六难 切片 slice
- 三七难 集合 map
- 三八难 通道 channel
- 三九难 函数 function
- 四十难 结构 struct
- 四一难 方法 method
- 四二难 接口 interface
- 四三难 指针
- 四四难 异常
- 四五难 模板应用
- 四六难 Go安装GRPC服务端和客户端
- 四七难 安装虚拟机软件(VirtualBox)
- 四八难 安装Centos7
- 四九难 --help
- 五十难 目录文件
- 五一难 系统磁盘
- 五二难 Shell
- 五三难 Nginx安装配置
- 五四难 PHP安装配置
- 五五难 MySQL安装配置
- 五六难 yum 安装 Apache PHP MySQL
- 五七难 安装gRPC
- 五八难 安装memcache
- 五九难 介绍
- 六十难 DIV + CSS
- 六一难 浏览器兼容问题
- 六二难 书写风格(Js中写Html)
- 六三难 NodeJs(Express框架pug模板引擎)
- 六四难 SQL优化工具SQLAdvisor
- 六五难 JpGraph图表
- 六六难 日期排序
- 六七难 大部分问题解决方法
- 六八难 小趣味
- 六九难 编程语言排行榜
- 七十难 PHP编辑器
- 七一难 Key
- 七二难 手动定位和自动定位当前文件位置
- 七三难 关闭代码提示
- 七四难 配置XDebug
- 七五难 配置FTP
- 七六难 配置SSH
- 七七难 Notepad++
- 七八难 XShell 和 Xftp
- 七九难 PHPExcel导入导出
- 八十难 编程科普
- 八一难 ThinkPHP5.1新特性: 容器
- 大雷音寺(领取经书)