mysql执行计划

猴子都能懂的数据库避坑指南,还说你不会?

老子叫甜甜 提交于 2020-03-06 15:08:39
前言 工作的这些年发现一个比较奇怪的现象就是身边无论是工作十多年的老兵,还是初级刚入行的程序员,在高谈阔论技术和趋势的时候都是人工智能,大数据,区块链,各种框架,语言,算法,AI,BI,CI,DI…… 等等,倒是发现很少有人关注数据库,不知道是因为数据库感觉太低端还是太低调,总是不容易被人提起 技术就是这样,不太关注的地方就不会重视,越是不被重视的地方,掉进坑里的概率就会越大,所以就在这里给大家简单聊聊在使用数据库过程中有哪些防掉坑指南,也可以对刚入行的小朋友有一个提醒的作用,万丈高楼平地起,一定要先打好基础再去考虑上层的建筑,不要舍本逐末 本章主要分以下四个小节(预计读完 5 分钟左右): 数据库为什么重要 数据库有哪些使用技巧 数据库有哪些容易掉进去的坑? 深入学习数据库的建议 数据库为什么重要 很多人在开发过程中不太关注数据库,对于表结构的设计也没什么讲究大多属于“能用就行”,但是根据作者将近十年的开发经验来看的话,只要你是从事 Web 相关领域开发你就无法避免不和数据库打交道, 在Web开发中大多功能操作本质上都是对数据库进行操作 ,不管你用是 Pythod,Java,Ruby 等语言进行 Web 开发,你其实都是在面向数据库进行编程,很多 Web 框架作者为了避免程序员接触数据库的相关知识甚至还封装了一层 ORM (Object Relational Mapping

PostgreSQL与MySQL对比

强颜欢笑 提交于 2020-03-06 11:59:32
都属于开放源码的一员,性能和功能都在高速地提高和增强。MySQL AB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好,所以对于任何商业数据库使用其中的任何一个都不能算是错误的选择。 PostgreSQL : 免费 原则: 对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。 1 架构对比 MySQL: 多线程 PostgreSQL: 多进程 多线程架构和多进程架构之间没有绝对的好坏,例如oracle在unix上是多进程架构,在windows上是多线程架构。 PG 的有多种集群架构可以选择,plproxy 可以支持语句级的镜像或分片,slony 可以进行字段级的同步设置,standby 可以构建WAL文件级或流式的读写分离集群,同步频率和集群策略调整方便,操作非常简单。 pgsql对于numa架构的支持比mysql强一些,比MYSQL对于读的性能更好一些,pgsql提交可以完全异步,而mysql的内存表不够实用(因为表锁的原因) 2 对存储过程[1]及事务的支持能力 1) MySQL对于无事务的MyISAM表,采用表锁定,一个长时间运行的查询很可能会长时间地阻碍对表的更新,而PostgreSQL不存在这样的问题。 2) PostgreSQL支持存储过程

Mysql Explain 关键字

有些话、适合烂在心里 提交于 2020-03-05 17:51:15
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。 -- 实际SQL,查找用户名为Jefabc的员工 select * from emp where name = 'Jefabc'; -- 查看SQL是否使用索引,前面加上explain即可 explain select * from emp where name = 'Jefabc'; expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra 概要描述: id:选择标识符 select_type:表示查询的类型。 table:输出结果集的表 partitions:匹配的分区 type:表示表的连接类型 possible_keys:表示查询时,可能使用的索引 key:表示实际使用的索引 key_len:索引字段的长度 ref:列与索引的比较 rows

数据库mysql

半世苍凉 提交于 2020-03-05 16:22:59
内容回顾 day35 # 并发编程 # io操作 : input/output # 阻塞 非阻塞(get_nowait) 同步 异步(start terminate submit map) 并发 并行 # 进程的三状态图 : 阻塞 运行 就绪 # 进程 计算机中最小的资源分配单位 # 进程之间数据隔离\资源不共享 # 可以利用多个CPU # 开启和销毁的开销大 # 由操作系统负责调度 # multiprocessing模块 # Process类 : 开启进程 # 各种操作进程的方法 # 守护进程 : 守护到主进程的代码结束 # IPC : 进程之间通信 # 基于文件Queue Pipe\基于网络 socket 第三方工具 # 进程中的互斥锁 Lock :性能好 # 进程中的递归锁 RLock : 效率低 # 递归锁可以锁多次不会发生死锁 # 线程 # 计算机中能够被操作系统调度的最小单位 # 线程之间资源共享 # 可以利用多核 # 开启和销毁的开销小 # 由操作系统负责调度 # GIL锁 : 全局解释器锁 互斥锁 # 导致了Cpython解释器下 同一个进程下的多个线程 不能利用多核 # 由于垃圾回收机制gc不能在多线程环境下正常进行引用计数 # threading模块 # Thread类 # 开启线程 # 守护线程 : 守护整个主线程的 # 子线程先结束 # 主线程结束 #

开发工具的学习以及认识

喜你入骨 提交于 2020-03-05 01:51:48
操作系统: 1.Windows操作系统 ⑴直观、高效的面向对象的图形用户界面,易学易用 ⑵用户界面统一、友好、漂亮 ⑶丰富的设备无关的图形操作 ⑷多任务操作环境 2.Unix操作系统 ⑴UNIX系统是一个多用户,多任务的分时操作系统 ⑵UNIX的系统结构可分为三部分:操作系统内核,系统调用,应用程序 ⑶UNIX系统大部分是由C语言编写的 ⑷UNIX提供了丰富的,精心挑选的系统调用 ⑸UNIX提供了功能强大的可编程的Shell语言作为用户界面 ⑹UNIX系统采用树状目录结构 ⑺UNIX系统采用进程对换的内存管理机制和请求调页的存储方式 ⑻UNIX系统提供多种通信机制 3.Linux操作系统 ⑴Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途 ⑵Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码 ⑶完全兼容POSIX1.0标准 ⑷多用户、多任务操作环境;支持多种平台 4.Mac OS操作系统 ⑴全屏模式是新版操作系统中最为重要的功能,一切应用程序均可以在全屏模式下运行 ⑵任务控制整合了Dock和控制面板,并可以窗口和全屏模式查看各种应用 ⑶快速启动面板的工作方式与iPad完全相同,它以类似于iPad的用户界面显示电脑中安装的一切应用,并通过App Store进行管理,用户可滑动鼠标,在多个应用图标界面间切换 ⑷Mac

mysql优化

久未见 提交于 2020-03-03 23:20:42
一、SQL语句优化 (1)使用limit对查询结果的记录进行限定 (2)避免select *,将需要查找的字段列出来 (3)使用连接(join)来代替子查询 (4)拆分大的delete或insert语句 二、选择合适的数据类型 (1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob (2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数 (3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar (4)尽可能使用not null定义字段 (5)尽量少用text,非用不可最好分表 三、选择合适的索引列 (1)查询频繁的列,在where,group by,order by,on从句中出现的列 (2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列 (3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好 (4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高: mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;

Mysql锁的优化

不想你离开。 提交于 2020-03-02 10:05:36
获取锁等待情况 可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺: mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Value | +----------------------------+----------+ | Table_locks_immediate | 105 | | Table_locks_waited | 3 | +----------------------------+----------+ 2 rows in set (0.00 sec) 可以通过检查Innodb_row_lock状态变量来分析系统上的行锁的争夺情况: mysql> show status like 'innodb_row_lock%'; +----------------------------------------+----------+ | Variable_name | Value | +----------------------------------------+----------+ | Innodb_row_lock_current_waits | 0 | |

开发人员MySQL调优-实战篇2-让SQL使用索引详解

て烟熏妆下的殇ゞ 提交于 2020-03-02 07:34:12
建议先看看 开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看表结构,不太关注索引和如何利用索引提高SQL执行速度,下面罗列一些经验,让你写的SQL更加高效的利用索引 在做实验之前最好先想一想索引的数据结构与排序,以及索引工作的方式,才能更快的理解与记住这些点,否则在工作中遇到更复杂的情况,很可能就不会处理了 查询字段与某一个索引的结构完全一致,包括字段和顺序(完全匹配) create index idx_tv_v_user_u_a_g on tb_v_user(user_name,age,gendor); select * from tb_v_user where user_name = '1F7sJ' and age = 44 and gendor = 1; 查询条件与索引的列与顺序完全一致,执行计划扫描类型为ref。有兴趣的同学可以试试分别将user_name、age、gendor查询条件删除,看看执行计划是什么情况 不在列上做任何附加操作,比如加函数 select * from tb_v_user where left(user_name,5) = '1F7sJ' and age=44 and gendor = 1; 这里的SQL和上面的SQL执行结果是一模一样,写法上区别是在user

MySQL的EXPLAIN的各项值

独自空忆成欢 提交于 2020-02-29 17:55:07
1、id 每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下。 若没有子查询和联合查询,id则都是1。Mysql会按照id从大到小的顺序执行query,在id相同的情况下,则从上到下执行。 2、select_type 查询中每个select子句的类型 (1)SIMPLE (2)PRIMARY/UNION (3)DEPENDENT UNION/UNIOIN RESULT (4)SUBQUERY/DEPENDENT SUBQUERY (5)DERIVED/MATERIALIZED (6)UNCACHEABLE SUBQUERY/UNCACHEABLE UNION 3、table 名字,被操作的对象名称,通常是表名,或者表的别名,或者一个为查询产生临时表的标示符(如派生表、子查询、集合)。 4、type 代表查询执行计划中表使用的连接方式。连接操作的类型。 (1)SYSTEM (2)CONST (3)EQ_REF (4)REF (5)REF_OR_NULL (6)RANGE (7)INDEX_SCAN (8)ALL (9)UNIQUE_SUBQUERY (10)INDEX_SUBQUERY (11)INDEX_MERGE (12)FT system > const > eq_ref > ref > fulltext > ref_or_null

MYSQL优化派生表(子查询)在From语句中的

最后都变了- 提交于 2020-02-29 15:21:31
Mysql 在5.6.3中,优化器更有效率地处理派生表( 在from语句中的子查询 ): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化。这一举措提高了性能: 1:之前版本(5.6.3),from语句中的子查询在 explain select 查看执行计划语句执行时就会物化。它导致了部分查询执行,但explain语句的目的是获取执行计划信息,而不是执行查询 该版本物化不会在explain中发生,所以explain执行计划结果的得到更快; 2:因为上面提及的,物化子查询的推迟有可能不会发生。考虑一个from语句中的子查询的结果和另一个表join(链接)查询,如果优化器先处理另一张表A,然后发现A中没有满足条件的行返回,此时join不会再继续执行,并且优化器会完全跳过物化子查询这步骤; 考虑下面的explain语句,子查询出现在form语句中; EXPLAIN SELECT * FROM (SELECT * FROM t1) AS derived_t1; 优化器避免物化子查询直到子查询的结果在查询真正执行需要时。在上面情况下,查询并没有执行,所有并没有物化(子查询); 即使查询执行时,也会要求优化器去避免物化。考虑下面的查询: SELECT * FROM t1 JOIN (SELECT t2.f1 FROM t2) AS derived