mysql执行计划

MySQL · 性能优化 · MySQL常见SQL错误用法

Deadly 提交于 2019-12-01 11:40:06
作者:db匠 来源: https://yq.aliyun.com/articles/72501 前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势。越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来。但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢,CPU打满等情况。阿里云RDS专家服务团队帮助云上客户解决过很多紧急问题。现将《ApsaraDB专家诊断报告》中出现的部分常见SQL问题总结如下,供大家参考。 常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。 SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10; 好吧,可能90%以上的DBA解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员仍然会抱怨:我只取10条记录为什么还是慢? 要知道数据库也并不知道第1000000条记录从什么地方开始

对付 MySQL 的死连接,Sleep的进程的来源探究[转]

谁说胖子不能爱 提交于 2019-12-01 11:13:16
对付 MySQL 的死连接,Sleep的进程的来源探究[转] 当前的连接数: mysql > show status like '%Threads_connected%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 27 | +-------------------+-------+ 1 row in set (0.00 sec) 最大连接数: show variables like '%max_connections%'; set GLOBAL max_connections=800; flush privileges 也可以修改/etc/my.cnf中的max_connections: max_connections = 1000 关于php应该在何时调用 mysql _close()以及pconnect 方式 和传统方式有何种区别收藏 以前我一直认为,当php的页面执行结束时,会自动释放掉一切。相信很多人都跟我想的一样。但事实证明并不是这样。比如session就不会随着页面执行完毕而释放。 php的垃圾回收机制,其实只针对于php本身。对于 mysql ,php没权利去自动去释放它的东西

mysql操作规范建议

℡╲_俬逩灬. 提交于 2019-12-01 10:27:00
作者: 听风,原文地址: https://www.cnblogs.com/huchong/p/10219318.html 。 数据库命令规范 数据库基本设计规范 所有表必须使用 Innodb 存储引擎 数据库和表的字符集统一使用 UTF8 所有表和字段都需要添加注释 尽量控制单表数据量的大小,建议控制在 500 万以内。 谨慎使用 MySQL 分区表 6.尽量做到冷热数据分离,减小表的宽度 禁止在表中建立预留字段 禁止在数据库中存储图片,文件等大的二进制数据 禁止在线上做数据库压力测试 禁止从开发环境,测试环境直接连接生成环境数据库 数据库字段设计规范 优先选择符合存储需要的最小的数据类型 避免使用 TEXT,BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据 避免使用 ENUM 类型 尽可能把所有列定义为 NOT NULL 使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间 同财务相关的金额类数据必须使用 decimal 类型 索引设计规范 限制每张表上的索引数量,建议单张表索引不超过 5 个 禁止给表中的每一列都建立单独的索引 每个 Innodb 表必须有个主键 常见索引列建议 5.如何选择索引列的顺序 避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间) 对于频繁的查询优先考虑使用覆盖索引 8.索引

MySQL 视图(合并多表数据)引发的严重性能问题

最后都变了- 提交于 2019-12-01 10:04:27
问题背景: 一、客户环境连续多次出现性能问题,系统登入异常,数据库CPU告警。 处理过程: 1>协助排查数据库性能问题时发现如下两个较频繁的SQL导致严重的性能问题(均使用了视图合并多表数据): 1. SELECT nodename FROM view_name1 WHERE id = xxx; 2. SELECT a.id rid,accounttype,belongto,resourceId,belongtoshow FROM view_name2 a LEFT JOIN tablename1 b ON a. col1= b.col1 WHERE a.col1> 0 ; 2> 上面两个SQL使用到了视图(视图通过union all合并了两张表的数据)。下面以t001和t002为例分别给出直接查询原表和使用视图查询的执行计划对比 (其中t001和t002表中id列均有索引):直接查询原表后对结果进行合并: 3>通过视图进行查询: create view t_view as select * from t001 union all select * from t002 ​ 4> 对比执行计划可以发现,使用视图进行数据union all会导致索引失效,使用了全表扫描的方式进行数据检索,在并发高的情况下, 占用较多的磁盘IO,严重消耗数据库的CPU和IO资源,影响到整体的数据库性能

MySQL性能优化(四)-- MySQL explain详解

删除回忆录丶 提交于 2019-12-01 09:42:53
转载地址: https://juejin.im/post/5d141528e51d4577565367d0 MySQL中的explain命令显示了mysql如何使用索引来处理select语句以及连接表。explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句。 一、格式 explain + select 语句; 例如:explain select * from tb_student; 二、5.5和5.7版本explain的区别 5.7之后的版本默认会有 partitions 和 filtered两列,但是5.5版本中是没有的,需要 使用explain partitions select ……来显示带有partitions 的列, 使用explain extended select ……来显示带有filtered的列。 本文是基于5.5.54版本的。 三、explain的作用 1.描述MySQL如何执行查询操作、执行顺序,使用到的索引,以及MySQL成功返回结果集需要执行的行数。 2.可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们的查询,让查询优化器能够更好的工作 查询优化器的作用: 1.优化select 语句,分析哪些是常量表达式(例如id=1),以及分析哪些表达式可以直接转换成常量的 2.对where条件进行简化和转换,如去掉无用条件

面试官:谈谈你对mysql索引的认识?

南笙酒味 提交于 2019-12-01 08:49:52
引言 大家好,我渣渣烟。我曾经写过一篇 《面试官:讲讲mysql表设计要注意啥》 ,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mysql面试题。还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎。 ps :其实很早就想写了,一直偷懒! 其实这下面每个问题,我都可以讲一篇文章出来!而且这些问题,不是我凭空编的。如下图所示( 注意看第三题 ) 所以我回忆了一下,索引常见考点有哪些,总结成了这篇文章! 主要题目有下面这些 (1)你一般怎么建索引的? (2)讲讲索引的分类?你知道哪些? (3)如何避免回表查询?什么是索引覆盖? (4)现在我有一个列,里头的数据都是唯一的,需要建一个索引,选唯一索引还是普通索引? (5)mysql索引是什么结构的?用红黑树可以么? (6)mysql某表建了多个单索引,查询多个条件时如何走索引的? 正文 1、你一般怎么建索引的? 烟哥注: 曾记得有一个粉丝来找我的时候,出现如下搞笑一幕 渣渣烟:"你这个简历上写了拥有SQL优化经验,你怎么建索引的? " 只见该粉丝嘿嘿一笑..说道:"就那样建啊…" 渣渣烟:"噢(第二声),就哪样建啊…" 粉丝:"…就网上说的那些索引规则啊" 渣渣烟:"那你怎么知道那些SQL出问题,需要建索引呢? " 粉丝:"我….." 嗯

mysql 完整备份和恢复

ぃ、小莉子 提交于 2019-12-01 08:03:57
一、MySQL完整备份操作 1、直接打包数据库文件夹 创建数据库auth: MariaDB [(none)]> create database auth; Query OK, 1 row affected (0.00 sec) 进入数据库: MariaDB [(none)]> use auth Database changed 创建数据表: MariaDB [auth]> create table user(name char(10)not null,ID int(48)); Query OK, 0 rows affected (0.01 sec) 插入数据信息: MariaDB [auth]> insert into user values('crushlinux','123'); Query OK, 1 row affected (0.01 sec) 查看数据信息: MariaDB [auth]> select * from user; +------------+------+ | name | ID | +------------+------+ | crushlinux | 123 | +------------+------+ 1 row in set (0.00 sec) 对它进行备份 先退出MySQL停库 [root@localhost ~]# systemctl

mysql 分页offset过大性能问题解决思路

喜你入骨 提交于 2019-12-01 07:49:55
在公司干活一般使用sqlserver数据库。rownumber分页贼好用。 但是晚上下班搞自己的事情就不用sqlserver了。原因就是自己的渣渣1核2g的小服务器完全扛不住sqlserver那么大的大块头,于是就使用Mysql数据库。 一般使用MySQL分页都是使用limit,我也这么使用的。 今天晚上打开一个服务器上的小网站,顺便点几下看看有没有问题,不小心点到了最后一页,卡了我近10秒才反应过来。我数据库就7w多条数据。虽说服务器垃圾也不至于卡这么久吧。。 然后把分页的sql找出来,去数据库手动执行。发现确实越往后翻页越慢,翻到四万多条的时候,都好几秒才响应了。这完全无法接受啊。难怪最近网站的搜索引擎权重又降低了。。5555 分页sql如下 select id ,title,time from table where type = ‘xxx’ ORDER BY createtime limit 10 offset 45000 因为Id是主键,我尝试去掉了title和time字段,马上就秒开了。 查看数据库执行计划,索引是已经命中了。但是为什么还是很卡呢? 查阅了不少资料,得出两个结论 1.服务器实在是太垃圾了。 2.limit x offset x 分页确实有性能问题,据说阿里的dba都不太建议offset太多。。。 解决方案: 既然都无法使用offset,那就曲线救国。

索引补充,命中索引

最后都变了- 提交于 2019-12-01 06:17:35
1、索引   索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2、索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null) 组合索引:多列值组成一个索引, 专门用于组合搜索,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索 索引合并,使用多个单列索引组合搜索 覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖 3、相关命令 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 - 查看表结构 desc 表名 - 查看生成表的SQL show create table 表名 - 查看索引 show index from 表名 - 查看执行时间 set profiling = 1; SQL... show profiles; 4、使用索引和不使用索引 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 由于索引是专门用于加速搜索而生,所以加上索引之后,查询效率会快到飞起来。 # 有索引 mysql> select * from tb1 where name = 'wupeiqi-888' ; + ----

mysql45讲

狂风中的少年 提交于 2019-12-01 06:12:37
一共48讲,学习时间2天。 开篇词 (1讲) 开篇词 | 这一次,让我们一起来搞懂MySQL 理论指导实践:先系统性的学习原理,再实践验证。 你可以从点到线再到面,形成自己到mysql知识网络。 在使用mysql时心里有底,知道怎么选择并且明白为什么。 了解原理,才能在实践中不断创新,提升个人到价值和工作输出。 基础篇 (8讲) 01 | 基础架构:一条SQL查询语句是如何执行的? 不要使用缓存,query_cache_type设置成DEMAND,这样默认不使用查询缓存。 要使用查询缓存的语句,用SQL_CACHE显示指定:select SQL_CACHE * from T where id = 10; MYSQL8.0开始删除了查询缓存功能。 慢查询日志中的rows_examined字段,表示这个语句执行过程中扫描了多少行 02 | 日志系统:一条SQL更新语句是如何执行的? 1.⾸先客户端通过tcp/ip发送⼀条sql语句到server层的SQL interface 2.SQL interface接到该请求后,先对该条语句进⾏解析,验证权限是否匹配 3.验证通过以后,分析器会对该语句分析,是否语法有错误等 4.接下来是优化器器⽣成相应的执⾏计划,选择最优的执⾏计划 5.之后会是执⾏器根据执⾏计划执⾏这条语句。在这⼀步会去open table,如果该table上有MDL,则等待。