一.昨天内容回顾

  1. 索引设计依据

    与数据表有关系的sql语句都统计出来

    where order by or等等条件的字段适当做索引

    原则:

    频率高的sql语句

    执行时间长的sql语句

    业务逻辑重要的sql语句

    什么样子字段不适合做索引?

    内容比较单调的字段不适合做索引

  2. 前缀索引

    一个字段只取前边的几位内容做索引

    好处:索引空间比较少、运行速度快

    前n位做索引,前n位要具备唯一标识当前记录的特点

  3. 全文索引

    Mysql5.5 只MYisam存储引擎可以实现

    Mysql5.6 Myisam和Innodb存储引擎都可以实现

    fulltext index 索引名称 (字段,字段)

    select * from 表名 where 字段 like '%内容%' or 字段 like '%内容%';

    select * from 表名 match(字段,字段) against("内容1,内容2");

    match(字段,字段) against("内容1,内容2")

  4. 索引结构

    Mysql的索引结构是B+Tree结构

    索引就是数据结构(自然有算法),算法可以保证数据非常快速被找到

    非聚集(Myisam)

    叶子节点的关键字(索引字段内容) 与 记录的物理地址对应

    聚集(Innodb)

    主(键)索引:叶子节点的关键字 与 整条记录对应

    非主(唯一/普通/全文)索引:叶子节点的关键字 与 主键关键字对应

  5. 查询缓存

    开启缓存,开辟缓存空间(64MB)

    缓存失效:表 或 数据 内容改变

    不使用缓存:sql语句有变化的信息,例如当前时间、随机数

    同一个业务逻辑的多个sql语句,有不同结构(空格变化、大小写变哈)的变化,每个样子的sql语句会分别设置缓存

  6. 分区、分表设计

    分区表算法(Mysql):key hash range list

    (php代码不会发生变化)

    分区增加或减少:

    减少:hash/range/list类型算法会丢失对应的数据

  7. 垂直分表

    把一个数据表的多个字段进行拆分,分别分配到不同的数据表中

    涉及的算法是php层面的

  8. 架构设计

    主从模式(读写分离、一主多从)

    主服务器负责"写"数据,从服务器负责"读"数据

    "主" 会 自动 给"从" 同步数据(mysql本身技术)

    通过"负载均衡"可以平均地从 从服务器 获得数据

  9. 慢查询日志设置

    show variables like 'slow_query_log%';

    开启慢查询日志开关

    设置时间阀值

    二.Mysql优化

    1. 大量写入记录信息

    保证数据非常快地写入到数据库中

    insert into 表名 values (),(),(),();

    以上一个insert语句可以同时写入多条记录信息,但是不要写入太多

    避免意外情况发生。

    可以一次少写一些,例如每次写入1000条,这样100万的记录信息,执行1000次insert语句就可以了。

    分批分时间把数据写入到数据库中。

    以上设计写入大量数据的方法损耗的时间:

    写入数据(1000条)----->为1000条数据维护索引

    写入数据(1000条)----->为第2个1000条数据维护索引

    ......

    写入数据(1000条)----->为第1000个1000条数据维护索引

    以上设计写入100万条记录信息,时间主要都被"维护索引"给占据了

    如果做优化:就可以减少索引的维护,达到整体运行时间变少。

    (索引维护不需要做1000次,就想做一次)

    解决:

    先把索引给停掉,专门把数据先写入到数据库中,最后在一次性维护索引

    1.1 Myisam数据表

  10. 数据表中已经存在数据(索引已经存在一部分)

    alter table 表名 disable keys;

    大量写入数据

    alter table 表名 enable keys; //最后统一维护索引

  11. 数据表中没有数据(索引内部没有东西)

    alter table 表名 drop primary key ,drop index 索引名称(唯一/普通/全文);

    大量写入数据

    alter table 表名 add primary key(id),(唯一/全文)index 索引名 (字段);

    1.2 Innodb数据表

    该存储引擎支持"事务"

    该特性使得我们可以一次性写入大量sql语句

    具体操作:

    start transaction;

    大量数据写入(100万条记录信息 insert被执行1000次)

    事务内部执行的insert的时候,数据还没有写入到数据库

    只有数据真实写入到数据库才会执行"索引"维护

    commit;

    commit执行完毕后最后会自动维护一次"索引";

    2. 单表、多表查询

    数据库操作有的时候设计到 连表查询、子查询操作。

    复合查询一般要涉及到多个数据表,

    多个数据表一起做查询好处:sql语句逻辑清晰、简单

    其中不妥当的地方是:消耗资源比较多、时间长

    不利于数据表的并发处理,因为需要长时间锁住多个表

    例如:

    查询每个品牌下商品的总数量(Goods/Brand)

    Goods:id name bd_id

    Brand: bd_id name

    select b.bd_id,b.name,count(g.*) from Brand b join Goods g on b.bd_id=g.bd_id group by b.bd_id;

    以上sql语句总运行时间是5s

    但是业务要求是数据库的并发性要高,就需要把"多个查询" 变为 "单表查询"

    步骤:

    ① select bd_id,count(*) from Goods group by bd_id; //查询每个品牌的商品数量 //3s

    ② select bd_id,name from Brand; //3s

    ③ 在php通过逻辑代码整合① 和 ② //1s

    3. limit使用

    数据分页使用limit;

    limit 偏移量,长度(每页条数);

    偏移量:(当前页码-1)*每页条数

    分页实现:

    每页获得10条信息:

    limit 0,10;

    limit 10,10;

    limit 20,10;

    limit 30,10;

    limit 990,10; //第100页

    limit 9990,10; //第1000页

    limit 99990,10; //第10000页

    limit 999990,10; //第100000页

    limit 1499990,10; //第150000页

    limit 1500000,10; //第150001页

    select * from emp limit 1500000,10; //慢 1秒多时间

    select * from emp where empno>1600001 limit 10; //快 0.00秒级

    数据表目前有empno主键索引:

    limit 偏移量,长度;运行时间较长:

    单纯运行limit 运行时间比较长,内部没有使用索引,翻页效果 之前页码的信息给获得出来,但是"越"过去,因此比较浪费时间

    现在对获得相同页码信息的sql语句进行优化

    由单纯limit变为 where 和 limit的组合:

    执行速度明显加快,因为其有使用where条件字段的索引

    4. order by null

    强制不排序

    有的sql语句在执行的时候,本身默认会有排序效果

    但是有的时候我们的业务不需要排序效果,就可以进行强制限制,进而"节省默认排序"带来的资源消耗。

    group by 字段;

    获得的结果在默认情况下会根据"分组字段"进行排序:

    order by null强制不排序,节省对应资源:

MySQL 第九天(核心优化三)的更多相关文章

  1. MySQL 第七天(核心优化一)

    一.Mysql核心优化 1. 优化的方面 ① 存储层:数据表"存储引擎"选取.字段选取.逆范式(3范式) ② 设计层:索引.分区/分表 ③ 架构层:分布式部署(主从模式/共享) ④ ...

  2. Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)

    目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...

  3. MySQL优化三(InnoDB优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  4. MySQL性能优化(三):索引

    原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...

  5. 十三、linux-mysql的mysql的核心优化思想

    一.数据库运维管理思想核心 1.未雨绸缪,不要停留在制度上,而是要实际做出来 2.亡羊补牢,举一反三,不要好了伤疤忘了疼 3.完善的框架设计及备份.恢复策略 4.定期思考,并实战模拟以上策略演练 二. ...

  6. MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

    逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. ...

  7. 第 8 章 MySQL 数据库 Query 的优化

      前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...

  8. MySQL 数据库 Query 的优化

    理解MySQL的Query Optimizer MySQL Optimizer是一个专门负责优化SELECT 语句的优化器模块,它主要的功能就是通过计算分析系统中收集的各种统计信息,为客户端请求的Qu ...

  9. MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化

    第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...

随机推荐

  1. treeGrid树形数据表格的json数据格式说明

    在使用easyUI 的treeGrid的时候,很多时候我们从数据库取出来的数据treeGrid却不能读取显示成一个树:如下 { menuCode: "a00", menuName: ...

  2. 罗辑思维(罗胖)阿瑟·黑利书:《大饭店》、《晚间新闻》、《超载》、《最后诊断》、《钱商》、《身高居位》电子书 pdf和mobi格式得到下载

    阿瑟黑利 mobi kindle mobi/txt 1.[智读]_超载.txt 2.[智读]_大饭店 - 阿瑟·黑利.mobi 3.[智读]_钱商 - [加拿大]阿瑟·黑利.mobi 4.[智读]_身 ...

  3. 6个错误将杀死你的App

    没有开发者或者设计师会故意破坏应用的设计.所有的应用程序创建者都对自己的应用寄予美好的愿望,但是很多错误是在他们无意识的状态下破坏app的设计.以下是应用开发者和设计者经常犯的几个错误,不过这些错误是 ...

  4. Markdown入门 学习

    Markdown简介 Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面. --维基百科 正如您在阅读的这份文档,它使用简单的符号标识不 ...

  5. 【solr】之solr界面查询返回距离并排序

    使用solr界面查询 {!geofilt}距离函数 star:[4 TO 5]星级排序 geodist() desc 距离排序 pt :31.221717,121.580891 sfield:loca ...

  6. es6 let

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 查看sql语句执行的消耗

    set statistics profile on set statistics io on set statistics time on go <这里写上你的语句...> go set ...

  8. 四则运算GUI设计2.0

    使用QT设计的界面如下: 程序流程是点击开始出题,会在题目后面的框中显示所出的题目,在输入答案以后点击提交答案会判断输入的答案是否正确. 输入后的界面: 部分代码如下: qtyunsuan.h文件: ...

  9. 25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation

    本文总结了使用Selenium Web driver 做页面自动化测试的一些 tips, tricks, snippets. 1. Chrome Driver 如何安装 extensions 两种方式 ...

  10. 尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)

    尝试打开或创建物理文件 'E:\Library.mdf' 时,CREATE FILE 遇到操作系统错误 5(拒绝访问.). 最佳回答: 这是因为SQL Server的启动帐户(一般是system或某个 ...