mysql执行计划

【Mysql】-- sql优化技巧

混江龙づ霸主 提交于 2019-12-05 19:49:48
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 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 5.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 6.下面的查询也将导致全表扫描: select

mysql索引最左匹配原则的理解

此生再无相见时 提交于 2019-12-05 14:53:15
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `cid` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name_cid_INX` (`name`,`cid`), KEY `name_INX` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 随便建了一个student表做测试。 create INDEX name_cid_INX ON student(name,cid) ; create INDEX name_INX ON student(name); 建了两个索引,故意这样建的。 执行1: EXPLAIN SELECT * FROM student WHERE name='小红'; 依据mysql索引最左匹配原则,两个索引都匹配上了,这个没有问题。。 执行2: EXPLAIN SELECT * FROM student WHERE cid=1; EXPLAIN SELECT * FROM student WHERE cid=1 AND name='小红'; 为什么还能匹配索引。 我来说一下吧: 这是你的表结构

MySQL并发引起的死锁案例分析

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-05 14:28:33
在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction at sun.reflect.GeneratedConstructorAccessor247.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1045) at com

MYSQL笔记-索引

巧了我就是萌 提交于 2019-12-05 14:17:43
1.索引 作用: - 约束 - 加速查找 索引分类(约束): - 普通索引:加速查找 - 主键索引:加速查找 + 不能为空 + 不能重复 - 唯一索引:加速查找 + 不能重复 - 联合索引(多列) : - 联合主键索引 - 联合唯一索引 - 联合普通索引 索引分类(加速查找): hash索引: 索引表存储(哈希值的顺序和数据表中的数据顺序不相同): 1.所有索引列数据转换成的哈希值 2.索引列数据的内存地址 hash索引优点: 查找单个值快 查找范围值慢 btree索引:二叉树(innodb) 二叉树存储: 先将索引列数据转化成数字,每个二叉树节点存储一个数字及索引列数据的地址, 二叉树节点的数字与子节点的数字有顺序关系(左子节点数字小于父节点,有子节点数字大于父节点) hash索引优点: 查找单个值慢 查找范围值快 建立索引: - a.额外的文件保存特殊的数据结构 - b.查询加快,插入更新删除相对也会变慢 - c.命中索引(此处email列建立了索引) select * from userinfo where email = 'asdf'; # 由于未命中索引,查询速度慢 select * from userinfo where email like 'asdf'; 普通索引: - create index 索引名称 on 表名(列名) - drop index 索引名称 on

神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!

孤街醉人 提交于 2019-12-05 13:36:43
前言   开心一刻     某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了。一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道:“猪回去了吗?”,家里人:“早回来了,你在哪了,怎么还没回来?”,他大怒道:“让它来接我,我特么迷路了!!!” 还不如我了 背景   某一天,楼主打完上班卡,坐在工位逛园子的时候,右下角的 QQ 闪了起来,而且还是个美女头像!我又惊又喜,脑中闪过我所认识的可能联系我的女性,得出个结论:她们这会不可能联系我呀,图像也没映象,到底是谁了?打开聊天窗口聊了起来   她:您好,我是公司客服某某某,请问 xxx后台 是您负责的吗?   我:您好,是我负责的,有什么问题吗?   她:我发现 xxx 页面点查询后,一直是 加载中... ,数据一直出不来,能帮忙看看吗?   我:是不是您的姿势不对?   她:我就 xxx,然后点查询   我:骚等下,我试试,确实有点慢,很长时间才能出来   她:是的,太慢了,出不来,都急死我了,能快点吗?   我:肯定能、必须能!您觉得什么速度让您觉得最舒服?   她:越快越好吧   我:呃...,是吗,我先看看是什么问题,处理好了告诉您,保证让您觉得舒服!   她:好的,谢谢!   公司没有专门的搜索服务,都是直接从 MySQL 查询

mysql定时任务(event事件)

痴心易碎 提交于 2019-12-05 11:59:23
1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的,事件也称为临时性触发器 事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次 2.创建事件 事件由两个主要部分组成,第一部分是事件调度(event schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action ),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者 benin...end语句块,这两种情况允许我们执行多条SQL sql语句创建事件: 每隔10秒往数据库插入一条数据 navicat创建事件: 右键新建事件: 编写需要执行的sql语句 设置计划任务 一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中

MySql数据库(学习笔记)

走远了吗. 提交于 2019-12-05 11:05:35
MySql数据库(学习笔记)* * * * 初次上传学习资料,有不足之处望指教。* * * DML:数据库(增删改操作) 1.mysql数据可库对某一字段进行加密可以使用MD5的加密方式或HEX的加密方式。 例: Emp(id,emp_name,password,email,iphone,prces,age) 雇员表 1.INSERT INTO emp(emp_name,PASSWORD,email,iphone,prces,age) VALUES(‘jack’,MD5(‘123456’),‘jack@163.com’,‘13749288666’,123.11,25); 2.INSERT INTO emp(emp_name,PASSWORD,email,iphone,prces,age) VALUES(‘jack3’,HEX(‘123456’),‘jack3@163.com’,‘15243285175’,125.11,27); 增加: 方式1:inserter into emp(emp_name,password,email,iphone,prces,age) values(‘asan’,‘123456’,’asan@163.com’,13749288666,13.14,20); //插入所有字段 方式2:inserter into emp(emp_name,password)

【0.4】mysql版本特性(5.6-8.0)

拥有回忆 提交于 2019-12-05 06:54:28
【1】Innodb 与 Myisam 的区别 1.InnoDB支持事物,而MyISAM不支持事物 2.InnoDB支持行级锁,而MyISAM支持表级锁 3.InnoDB支持MVCC, 而MyISAM不支持 4.InnoDB支持外键,而MyISAM不支持 5.InnoDB不支持全文索引,而MyISAM支持。 6.InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持 7.InnoDB表支持多种行格式, myisam 不支持 8.InnoDB是索引组织表, myisam 是堆表 【2】Innnodb 四大特性 (1)插入缓冲,(2)二次写,(3)自适应哈希,(4)预读 【2.1】插入缓冲(insert buffer) 插入缓冲(Insert Buffer/Change Buffer):提升插入性能,change buffering是insert buffer的加强,insert buffer只针对insert有效,change buffering对insert、delete、update(delete+insert)、purge都有效   只对于非聚集索引(非唯一)的插入和更新有效,对于每一次的插入不是写到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在则直接插入;   若不在,则先放到Insert Buffer 中,再按照一定的频率进行合并操作

mysql

倾然丶 夕夏残阳落幕 提交于 2019-12-05 06:51:19
1、Tps与Qps TPS: (每秒事务处理量(TransactionPerSecond)) TPS = (COM_COMMIT + COM_ROLLBACK)/UPTIME 事务提交加事务回滚的和再除以时间 QPS:每秒查询率 QPS = QUESTIONS/UPTIME 查询的个数除以时间 2、MySqlSlap mysql压力测试工具 3、mysql架构与存储引擎   逻辑架构:连接层、服务层、引擎层、存储层 连接层:连接验证账号密码 服务层:解析sql,优化与缓存,缓存会默认缓存sql语句, 通过配置缓存结果数据(my.ini里找query_cache_type 是否开启缓存: show variables like '%query_cache_type'; 查看缓存的大小:show variables like '%query_cache_size'; 设置缓存的大小:SET GLOBAL query_cache_size = 134217728) 生产环境建议不开启,占用内存。推荐使用redis。 sql解析:顺序 1 FROM <left_table> 2 ON <join_condition> 3 <join_type> JOIN <right_table> 4 WHERE <where_condition> 5 GROUP BY <group_by_list> 6

MySQL 中间件 - DBLE 简单使用

∥☆過路亽.° 提交于 2019-12-05 04:48:43
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持; 环境准备 DBLE项目资料 DBLE官方网站:https: //opensource.actionsky.com 可以详细了解DBLE的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础 DBLE官方项目:https: //github.com/actiontech/dble 如对源码有兴趣或者需要定制的功能的可以通过源码编译 DBLE下载地址:https: //github.com/actiontech/dble/releases 建议下载最新的releases版本,下载tar压缩包即可,如有源码编译需求的,可以下载源码包 DBLE社区交流: 669663113 安装JDK环境 DBLE是使用java开发的,所以需要启动dble需要先在机器上安装java版本1.8或以上,并且确保JAVA_HOME参数被正确的设置; 这里通过yum源的方式安装了openjdk,同学们可以自行google jdk的几百种安装方式,这里不在赘述; # yum install java-1.8.0-openjdk 确认java环境已配置完成 # java -version openjdk