请问MySQL 并行了吗

请问MySQL 并行了吗,第1张

为给那些只为获得答案的看众节省时间。提前下个结论,

mysql目前暂不具备并行运行某一查询的能力

。相信很多人有一个误解,似乎MySQL 54对某一查询带来的性能改进是非常巨大的。事实上,这需要针对具体应用来讲,如果追求某个具体查询的响应时间,54 将比51或之前的版本差。简单的来说,54提高的是并发量,而不是减少单条语句的执行时间。

初次看到这个话题的人要注意几个概念,并行和多线程不是同一个概念。“同时进行”的技术分很多类,有

查询间的并行,

查询内的并行和 *** 作内的并行

。举个生活中的例子,

如果你与其他人合租房子的话,早上起来后,多个人可以同时刷牙,洗脸和做饭,大家各忙各的(虽然女房客可能会给厕所加上mutex而其他人只能在原地spin)。单单这套房子来说,它在较短的时间内解决了好几个人的早上洗漱问题。这就是查询间并发了。

早上诸多行动中,以刷牙、做饭、吃饭这三个动作为例,我们通常的做法是把微波炉转上,然后刷牙,刷牙结束后,早饭也弄好了(至少我是这么做的),这样我们达到了查询内的并行。

再细化下去,现在加一个动作:整理电脑包,按照上一种方式我们可以按这样的顺序做事情:做饭刷牙 02 02 02—》 02 02 02吃饭 02 02 02 02 — -》02 整理电脑包

如果你有两只手的话,我们可以用一只手刷牙,另外一只手整理电脑包,这样进一步缩短你的运行时间,这样你就做到了 *** 作内的并行。

总结起来:第一种情况整体吞吐量很大,但个人的准备时间可能更长了。第二种情况,个人的处理时间减少了。 第三种情况,个人的处理时间进一步减少。

有兴趣的人可以在

database system concepts

这本书中了解相关概念。查询间的并行对于数据库管理软件来说是再正常不过的功能,所以下面我们将直接跳过这类“同时进行”。从理论上讲,数据库的多个模块:IO、SQL解析和SQL执行等都可以达到并行执行的目的。

通过将关系划分到多个磁盘来减少从磁盘检索关系所需的时间,从而使得数据库IO可以并行执行。另外在一个查询中的多个联接 *** 作和排序 *** 作也可并行发生。对等值联接和自然联接, 可以将两个输入关系划分到多个处理器上, 各处理器在本地计算联接

当然以上讨论的一切一切都基于CPU是多核的。

但是目前我个人不支持mysql并行化,这也符合很大一部分mysql开发人员的意见。理由:

就mysql目前的应用来看,使用者更在意mysql数据库的吞吐量,而不是效应速度(当然了,响应速度也是很重要的)。mysql目前的简单架构replication可大幅提高数据库端的吞吐量。

目前现存的其他开源技术亦能满足并行查询的需求如hadoop、map reduce。

最后,我们还可以利用mysql proxy来达到并行的目的。查询在mysql proxy中被划分成多个部分,各个部分可在不同的mysql服务器上查询获得数据,再由mysql proxy合并返回给读者。

Mysql数据库3种存储(MyISAM、MEMORY、InnoDB)引擎区别:

1、Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。MEMORY、InnoDB不是默认存储引擎。

2、InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引

Mysql数据库3种存储(MyISAM、MEMORY、InnoDB)区别对比:

1、MyISAM

它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。

数据文件和索引文件可以放置在不同的目录,平均分配IO,获取更快的速度。要指定数据文件和索引文件的路径,需要在创建表的时候通过DATA DIRECTORY和INDEX DIRECTORY语句指定,文件路径需要使用绝对路径。

2、MEMORY

memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是frm。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。

默认情况下,memory数据表使用散列索引,利用这种索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了。因此,散列索引值适合使用在"="和"<=>"的 *** 作符中,不适合使用在"<"或">" *** 作符中,也同样不适合用在order by字句里。如果确实要使用"<"或">"或betwen *** 作符,可以使用btree索引来加快速度。

存储在MEMORY数据表里的数据行使用的是长度不变的格式,因此加快处理速度,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型。VARCHAR是一种长度可变的类型,但因为它在MySQL内部当作长度固定不变的CHAR类型,所以可以使用。

3、InnoDB

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

(1)自动增长列:

InnoDB表的自动增长列可以手工插入,但是插入的如果是空或0,则实际插入到则是自动增长后到值。可以通过"ALTER TABLEAUTO_INCREMENT=n;"语句强制设置自动增长值的起始值,默认为1,但是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。

可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入多条记录,那么返回的是第一条记录使用的自动增长值。对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。

(2)外键约束:

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。

用户在rulexml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表

在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类    enum 分区算法    分片枚举  

两种中间件的枚举分片算法使用上无差别。

开发注意点

分片索引1 整型数字(可以为负数)或字符串((不含=和换行符)

分片索引2 枚举值之间不能重复

Male=0Male=1

或者

123=1123=2

会导致分片策略加载出错

分片索引3 不同枚举值可以映射到同一个分片上

Mr=0Mrs=1Miss=1Ms=1123=0

运维注意点

扩容1 增加枚举值无需数据再平衡

扩容2 增加一个枚举值的分片数量数时,需要对局部数据进行迁移

缩容1 减少枚举值需要数据再平衡

缩容2 减少一个枚举值的分片数量数时,需要对局部数据进行迁移

配置注意点

配置项1 在 rulexml 中,可配置项为 <property name="defaultNode"> 、<property name="mapFile"> 和 <property name="type">

配置项2 在 rulexml 中配置 <property name="defaultNode"> 标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片

配置项3 在 rulexml 中配置 <property name="mapFile"> 标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_maptxt 时,配置值就可以简写为 map/table_maptxt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。

配置项4 编辑 mapFile 所配置的文件

记录格式为:<枚举值>=<分片编号>

枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行

配置项5 在 rulexml 中配置 <property name="type"> 标签;type 必须为整型;取值为 0 时,mapFile 的<枚举值>必须为整型;取值为非 0 时,mapFile 的<枚举值>可以是任意字符(除了=和换行符)

MyISAM、InnoDB、Heap(Memory)、NDB

貌似一般都是使用InnoDB的,mysql的存储引擎包括:MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。

最常使用的2种存储引擎:

1Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是frm(存储表定义)、MYD(MYData,存储数据)、MYI(MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。

2InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

以上就是关于请问MySQL 并行了吗全部的内容,包括:请问MySQL 并行了吗、Mysql数据库3种存储引擎有什么区别、mysql里 enum(F,M,S)什么意思I等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9779935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存