mysql技术内幕笔记

1.innodb对于独立子查询,具体执行时会转换成关联子查询然后执行,这个性能是很差的,比如

select * from upload_files where file_time in (select max(file_time) file_time from upload_files group by from_unixtime(file_time,‘%Y%m‘)); 针对2000多条数据要执行14秒才能完成,显然太慢;

直接写成内关联查询 select *,from_unixtime(a.file_time,‘%Y%m‘) tt from upload_files a inner join   (select max(file_time) file_time from upload_files group by from_unixtime(file_time,‘%Y%m‘)) b on a.file_time =b.file_time 就好多了,执行时间只有0.34秒;

直接改成关联查询也可以(多一层)select *,from_unixtime(file_time,‘%Y%m‘) tt from upload_files a  where exists(select * from  (select max(file_time) file_time from upload_files group by from_unixtime(file_time,‘%Y%m‘)) b where a.file_time = b.file_time);这个性能和内关联是一样的。
2.查询每个员工最大订单日期的订单(员工号和订单日期主查询和子查询都必须匹配):

虽然可以得到正确结果,但性能太差;使用派生表可以避免子查询和外查询过多的比较操作,派生表的方法为:

此方法性能提升很多。如果每个人只想显示一条数据的话则sql语句(需要找出最大的订单号)变为

派生表比子查询的性能要好


但这个不会对执行有任何的影响

3.

因此对于条件列含有null值时,in必须对null值进行过滤才能得出和exists相同的结果,比如select * from site_article_channel where article_id not in (10,12,null)

article_id 不为10,12的数据存在,但not in (10,12,null)的值为false或unknown,故此得不到任何结果

4.

5.natural join可以理解为将两个表相同名称的列进行关联,不需要指明;例如

6.straight join功能上等同于join,它为用户提供了一种方法可以用来控制优化器,

这个情况只适用于多表关联查询时,优化器无法提供正确的优化方案的情况,用户可以强制优化器按用户指定的顺序去关联表

7.self join就是表自己连接自己,self并不会出现

8.unoin(集合操作,垂直操作),mysql支持unoin all和unoin
distinct两种集合操作方式,进行集合操作的两张表列数必须相同,如果数据类型不同,数据库会进行隐式转换,同时结果列的名称由第一个表决定;unoin
distinct一般写为unoin ,distinct会省略掉;所以对于unoin all中的all则必须带着,用以区分。


9.pivoting:技术是指一种可以把行转换为列的技术,Unpivoting可以看作是pivoting的反向操作,即将列旋转成为行

10.rollup是根据维度在数据结果集中进行聚合操作,其优点是一次可以取得N次group
by的结果;对单列执行rollup的情况

此时结果为


比较不添加rollup的情况,最后多了一个汇总行,这在需要汇总数据的时候还是有必要的。

多列执行rollup的情况,

得到结果如下


 

其结果等同于

但性能上要好很多,只需要一次表扫描即可,而后者需要做四次表的扫描;不过需要注意的是rollup不能与order
by一起使用,那么与limit一起使用语法上可以但一般没有意义,另外就是对null的处理,如果聚合的列含有null值则可能出错,这时最好进行ifnull(列明,替换值)处理。

11.事务(扁平事务,带保存点的扁平事务,链事务,嵌套事务,其中扁平事务最常用):


事务 

采用事务对于插入或更新,删除等操作,操作完毕一次提交,比不适用事务的情况性能要好,因为采用事务只写了一次日志,而不不使用的情况则会有多次写日志操作

innodb存储引擎会对操作自动提交,有时这不是个好事情,对于事务开启后这个自动功能是会禁用的,等事务结束系统会自动打开;对于“事务要短小,不能有长时间运行的大事务”这条在mysql
的innodb上不适用。

12.辅助索引一般体积比聚集索引小很多(它不包含所有的列),如果查询条件可以命中辅助索引性能一般会更好,此时不需要使用聚集索引,称为覆盖索引。

在某些特殊的情况下可以通过查询语句后面跟force 
index(索引名)强制查询采用某个索引,例如



例如

force则不同,他是强制的

13.分区:innodb,myisam以及ndb三种引擎都支持分区,csv等就不支持分区

局部分区:数据和相关索引存放在一个分区内

全局分区:数据存放在各个分区内,索引单独存放

水平分区:按行进行分区,同一个行肯定在一个分区内

垂直分区:按列分区,同一个列肯定在一个分区内

目前mysql仅支持局部分区,并且仅支持水平分区不支持垂直分区,mysql的分区分为四种类型,

  • range(属于某个条件连续区间的数据放入一个分区),
  • list(面向离散的值),
  • hash(根据用户自定义的表达式的值来进行分区,返回值不能为负数),
  • key(根据数据库的散列函数来进行分区)

不论那种类型的分区,如果表存在主键或唯一索引,那么分区列必须是他们的一部分;如果没有主键或唯一索引,那么任何列都可以作为分区列。

注意:对于range类型分区,如果按年分区的话,查询条件是日期,那么依然会扫描所有分区,得不到应有的效果,如果采用

这种分区才是合适的,因此分区要考虑实际的使用场景。最好查询条件和分区标准一致。

list类型分区与让个类似,只是采用了values in(1,2,3等类似的散列值);

对于插入不符合分区的值时,range和list分区类型都一样,会报错,无法插入;如果一次插入多条数据,对于不同的引擎又有区别:

innodb会将多个插入是为一个事务,遇到错误,整体回滚;MyIsam则不同,错误前的插入,错误后的无法插入,其实还是本质上对事务是否支持的区别。

mysql5.5以前的版本,分区的条件必选是整型值(如果不是必选通过函数转换成整型值);5.5以后则可以用整型值,时间以及字符串等字段作为条件。

子分区:如果要创建子分区,则所有分区上的子分区个数必须相同并且名称不能重复。

Null值:mysql将null值视为比任何非null值都小,分区时也一样;

B+树可以很好的完成大数据表的操作,不需要分区的帮助,相反分区如果不合理,则还会降低性能;相对而言,分区的技术更适合于olap的业务,而非oltp的业务。

一般来讲,对于符合分区条件的查询才会很快,对于不符合条件的则查询成本反而会成倍增长。

 

 

 

 

 

时间: 2024-12-06 22:30:29

mysql技术内幕笔记的相关文章

MySQL技术内幕-InnoDB存储引擎-读书笔记(二)

MySQL技术内幕-InnoDB存储引擎-读书笔记(二) 作为php开发,使用mysql总是少不了的 系列文章博客链接 http://itsong.net/articles/466.html 第三章 文件 mysql与innodb几个类型的文件 参数文件,配置路径.初始化参数.内存大小等 日志文件,包括错误日志,二进制日志,慢查询日志,查询日志 socket文件,用unix域套接字,unix domain socket来进行连接时需要的文件,这一般是本机连接,比通常tcp快 pid文件,进程id

MySQL技术内幕-InnoDB存储引擎-读书笔记(一)

MySQL技术内幕-InnoDB存储引擎-读书笔记(一) 作为php开发,使用mysql总是少不了的 博客链接 http://itsong.net/articles/466.html 第一章 MySQL体系结构和存储引擎 MySQL被设计为一个单进程多线程架构的数据库 ./mysql --help | grep my.cnf 可以查看mysql数据库实例启动时,它会在哪些位置查找配置文件. 配置文件中有一个datadir参数,指定了数据库所在的路径.默认为/usr/local/mysql/dat

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是按主键的顺序记性存放 支持全文索引(InnoDB1.2.x - mysql5.6) 支持MVCC(多版本并发控制)实现高并发 MyISAM: 不支持事务 表锁 支持全文索引 三.InnoDB体系架构 1.后台线程 Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性 IO

mysql技术内幕InnoDB存储引擎-阅读笔记

mysql技术内幕InnoDB存储引擎这本书断断续续看了近10天左右,应该说作者有比较丰富的开发水平,在源码级别上分析的比较透彻.如果结合高可用mysql和高性能mysql来看或许效果会更好,可惜书太厚,还在啃当中,希望能早点读完……. 应该说与oracle相比,mysql数据库还是相对比简单,以后还是深入学习下oracle去. 搞数据库也比搞应用运维相对单纯,不用知道各种应用架构,不用写各种脚本工具,只要掌握这个软件就足够了.当然希望自己的知识还是全面一些好.

SQL Server技术内幕笔记合集

SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnblogs.com/lyhabc/articles/3914213.html Microsoft SQL Server 2005技术内幕:T-SQL查询笔记http://www.cnblogs.com/lyhabc/articles/3912608.html Microsoft SQL Server 2

Mysql技术内幕——表&索引算法和锁

表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示的定义主键则innodb如按照如下方式选择或者创建主键.首先表中是否有唯一非空索引(unique not null),如果有则该列即为主键.不符合上述条件,innodb存储引擎会自动创建一个6字节大小的指针,rowid(). 4.2.innodb逻辑存储结构 innodb的逻辑存储单元由大到小分别是

spring技术内幕笔记1

spring的设计目标(为什么要用spring) 如果我们要简要地描述Spring的设计目标,可以这么说,Spring为开发者提供的是一个一站式的轻量级应用开发框架(平台).作为平台,Spring抽象了我们在许多应用开发中遇到的共性问题:同时,作为一个轻量级的应用开发框架,Spring和传统的J2EE开发相比,有其自身的特点.通过这些自身的特点, Spring充分体现了它的设计理念:在Java EE的应用开发中,支持POJO和使用JavaBean的开发方式,使应用面向接口开发,充分支持OO(面向

JS篇 <<Webkit技术内幕>>笔记

发展: 2003年 苹果发布Safari浏览器 2005年 Webkit项目开源,项目包括:WebCore.Javascript引擎.系统调用接口层等 2004年 Firefox浏览器发布 2008年 基于Webkit内核的Chromium项目启动 2010年 内部增加Webkit2子项目,类似于Blink思想,基于多进程的方式,分离浏览器接口调用层和实现层(渲染层). 2013年 基于分歧,Google宣布独立运作Blink项目 Webkit渲染过程分为三个阶段: 1. 生成DOM树 URL请

《MySQL技术内幕 InnoDB存储引擎 》学习笔记

第1章  MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP(联机事务处理,面向基本的.日常的事务处理) 支持事务,支持外键.支持行锁(有的情况下也会锁住整个表).非锁定读(默认读取操作不会产生锁) 通过使用MVCC来获取高并发性,并且实现sql标准的4种隔离级别,默认为可重复读级别 使用一种被称成next-key locking的策略来避免幻读(phant