mysql执行计划

图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了

孤者浪人 提交于 2019-11-26 12:57:06
https://blog.csdn.net/plg17/article/details/78758593 **************************************************************** 用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。 MySQL版本:Server version: 5.6.31 MySQL Community Server (GPL) 数据库表:a_table、b_table 主题:内连接、左连接(左外连接)、右连接(右外连接)、全连接(全外连接) 前提 建表语句: CREATE TABLE `a_table` ( `a_id` int(11) DEFAULT NULL, `a_name` varchar(10) DEFAULT NULL, `a_part` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE `b_table` ( `b_id` int(11) DEFAULT NULL, `b_name` varchar(10) DEFAULT NULL, `b_part`

SQL性能优化(efficacious )

跟風遠走 提交于 2019-11-26 12:46:55
1、优化目标 减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。 降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标 2、优化方法 一、改变 SQL 执行计划 明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是 改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据 ,以达到 “ 减少 IO 次数 ” 和 “ 降低 CPU 计算 ” 的目标 常见误区 (1)count(1)和count(primary_key) 优于 count(*) X 很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差

MYSQL语句中的explain

对着背影说爱祢 提交于 2019-11-26 12:11:03
1.使用mysql explain的原因    在我们程序员的日常写代码中,有时候会发现我们写的sql语句运行的特别慢,导致响应时间特别长,这种情况在高并发的情况下,我们的网站会直接崩溃,为什么双十一的淘宝在如此高的并发访问量的情况下依旧运转良好,除了过硬的设备以及服务器分流等技术外,良好的sql查询语句也是功不可没的! 我们会去寻找并且记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,此时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。 一个完整的查询语句的explain展现在我们眼前(explain也只能使用在select语句中): expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面对这些字段出现的可能进行解释: 1. id: 包含一组数字,表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下,否则id值越大(通常子查询会产生)优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行  id列为null的就表是这是一个结果集

浅谈 MySQL 子查询及其优化

被刻印的时光 ゝ 提交于 2019-11-26 10:34:57
使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有可能会让你大失所望,在我们的生产系统上就碰到过一些案例,例如: SELECT i_id, sum(i_sell) AS i_sell FROM table_data WHERE i_id IN (SELECT i_id FROM table_data WHERE Gmt_create >= '2011-10-07 00:00:00') GROUP BY i_id; (备注:sql的业务逻辑可以打个比方:先查询出10-07号新卖出的100本书,然后在查询这新卖出的100本书在全年的销量情况)。 这条sql之所以出现的性能问题在于mysql优化器在处理 子查询的弱点 ,mysql优化器在处理子查询的时候,会将将子查询改写。通常情况下,我们希望由内到外,先完成子查询的结果,然后在用子查询来驱动外查询的表,完成查询;但是mysql处理为将会先扫描外面表中的所有数据,每条数据将会传到子查询中与子查询关联,如果外表很大的话,那么性能上将会出现问题; 针对上面的查询,由于table_data这张表的数据有70W的数据,同时子查询中的数据较多,有大量是重复的,这样就需要关联近70W次

Python学习数据库连表查询

落爺英雄遲暮 提交于 2019-11-26 10:21:52
9.9 连表查询 【实例】通过例子来熟悉连表查询的概念 # 第一步:建表 # 建立英雄职业分类表格 create table classification( id int, name varchar(20) ); # 英雄属性表格 create table hero( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', cd int, # 技能时间 cha_id int # 英雄职业 ); # 插入数据 insert into classification values (200,'法师'), (201,'战士'), (202,'射手'), (203,'辅助'); insert into hero(name,sex,cd,cha_id) values ('莫甘娜','female',40,200), ('盖伦','male',50,201), ('赵信','male',48,201), ('女警','female',35,202), ('梦魇','male',30,200), ('阿卡丽','female',28,204) ; 笛卡尔积 ​ 交叉连接实例:在没有任何条件连接的情况下联合两张表进行查询,结果会以笛卡尔积的形式显示

MySQL 联合索引

一个人想着一个人 提交于 2019-11-26 10:14:30
【 准备 】   首先创建一个表 test(A,B,C),创建一个联合索引 index_test(A,B,C)。根据排列组合,测试下面多种查询,并分析比较其执行计划。 【 一个字段:只有联合索引的字段 】          【 两个字段 :只有联合索引的字段 】    【 三个字段 :只有联合索引的字段 】          来源: https://www.cnblogs.com/zlxyt/p/11933394.html

MySQL千万级数据的查询优化

我是研究僧i 提交于 2019-11-26 08:25:43
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在 num 上设置默认值0,确保表中 num 列没有 null 值,然后这样查询: select id from t where num=0 。 应尽量避免在 where 子句中使用 != 或 < > 操作符,否则引擎将放弃使用索引而进行全表扫描。 应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20 。 in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3 。 下面的查询也将导致全表扫描:

mysql常用命令

点点圈 提交于 2019-11-26 07:57:06
连接到本机上的MYSQL mysql -u root -p 连接到远程主机上的MYSQL。 假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令: mysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样) 退出MYSQL命令 : exit (回车) 创建数据库 create database <数据库名>; create database mydatabase; 删除数据库 drop database <数据库名>; drop database mydatabase; 查看数据库 show databases; 选择使用数据库 use mydatabase; 创建数据库表 CREATE TABLE `home_banner` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `url` varchar(100) NOT NULL DEFAULT '' COMMENT '图片 URL', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='首页 Banner' 查看所有表 show

[官方] mysql 性能优化文档(中英文自译)

萝らか妹 提交于 2019-11-25 23:48:57
大家好,我是烤鸭 : 根据官方文档翻译并精简部分内容。建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完。自己翻译的有些地方可能不完整,欢迎指正。 官方pdf下载,需登录: https://www.mysql.com/cn/why-mysql/presentations/tune-mysql-queries-performance/ csdn下载地址: https://download.csdn.net/download/angry_mills/10953302 简化版地址: https://blog.csdn.net/Angry_Mills/article/details/88081834 [官方] mysql 性能优化文档(中英文自译) How to Analyze and Tune MySQL Queries for Better Performance `如何分析和调整MySQL查询以获得更好的性能` Program Agenda `目录` Cost-based query optimization in MySQL `MySQL中基于成本的查询优化` Tools for monitoring, analyzing, and tuning queries `用于监视,分析和调整查询的工具 ` Data access and index

阿里系统研发部数据库组教你一文搞懂 MySQL 单表查询的底层实现

旧巷老猫 提交于 2019-11-25 20:48:52
对于我们这些 MySQL的使用者来说,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。 MySQL有一个称为 查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。不过查询优化这个主题有点儿大,在学会跑之前还得先学会走,所以本章先来瞅瞅 MySQL怎么执行单表查询(就是 FROM子句后边只有一个表,最简单的那种查询~)。 为了故事的发展,先得有个表: 我们为这个 single_table表建立了1个聚簇索引和4个二级索引,分别是: 为 id列建立的聚簇索引。 为 key1列建立的 idx_key1二级索引。 为 key2列建立的 idx_key2二级索引,而且该索引是唯一二级索引。 为 key3列建立的 idx_key3二级索引。 为 key_part1、 key_part2、 key_part3列建立的 idx_key_part二级索引,这也是一个联合索引。 然后我们需要为这个表插入10000行记录,除 id列外其余的列都插入随机值就好了,具体的插入语句我就不写了