导航:首页 > 网络数据 > 大数据多表

大数据多表

发布时间:2023-01-16 06:25:14

① mysql执行多表查询,大数据,sql该怎么写

你应该在每个表的查询字段上创建索引,这样可以提高查询效率。这个查询只能逐个表查,你可以用union把查询结果并到一起,这样一次查询连接就可以了,能减少因为连接造成的开销。

② 多表连接查询和多次单表查询哪个效率高为什么

如果数据量小的表,这样的设计意义不大,而且当然是单表速度快。若在大数据量情况下,设计非常有意义。在多表连接中注意数据的条目和外健,避免出行大量冗余数据导致性能下降。下面我以Oracle讲讲数据查询的整个过程技术。

由于数据分布到数据块,在大量数据设计中可以将数据存储于多个数据块,在高并发进程的随机访问的情况下,能有效减少块冲突 同样的数据需要更多的数据块来存储,由于数据块的块头元信息大小固定,所以需要更多的空间来存储块头元信息。行长度过大容易导致行连接,从而导致Oracle获取数据块的效率降低 ,在行长度固定的前提下,单块能够存储更多的数据行,也就意味着Oracle一次I/O能读取更多的数据行。适合连续顺序读或者存放大对象数据(如LOB数据) 由于大数据块可以存放更多的索引叶节点信息,容易引起争用,所以大数据块不适合存放索引叶节点信息。

大量数据表的数据库参数设置DB_FILE_MULTIBLOCK_READ_COUNT表示Oracle一次顺序I/O读操作最多能读取的数据块块数。该参数的默认值随操作系统的不同而不同。在全表扫描或者索引快速扫描比较多的系统中(如DSS系统),建议将该值设置得较大。但是DB_FILE_MULTIBLOCK_READ_COUNT参数受操作最大单次I/O大小的限制,大多数操作系统单次读操作的大小不能超过1MB,这也就意味着在8KB数据块大小的情况下,该参数最大值为128。值得一提的是,该参数的大小还会影响Oracle CBO对执行计划的评估,如果设成较大值,Oracle的执行计划倾向于全表扫描。当该参数设置为0或者保持默认时,CBO假设全表扫描时最多能连续读取8个数据块。从Oracle 11R2开始,DB_FILE_MULTIBLOCK_READ_COUNT的取值算法如下:

db_file_multiblock_read_count = min(1048576/db_block_size , db_cache_size/

(sessions * db_block_size))

注意数据库参数BLOCK_SIZE在设定之后,在数据库生命周期内不可更改。

当执行SELECT语句时,如果在内存里找不到相应的数据,就会从磁盘读取进而缓存至LRU末端(冷端),这个过程就叫物理读。当相应数据已在内存,就会逻辑读。我物理读是磁盘读,逻辑读是内存读;内存读的速度远比磁盘读来得快。

下面将本人大数据分区设计截图,为大家参考学习。

先贴俩图镇镇场。

引言

对于内连接,使用单个查询是有意义的,因为你只获得匹配的行。

对于左连接,多个查询要好得多。


数据说话

看看下面的基准测试:

5个连接的单个查询

一行5个查询

注意,我们在两种情况下得到了 相同的结果 (6 x 50 x 7 x 12 x 90 = 2268000)


总结一下

对于冗余数据,左连接使用更多的内存。

如果只执行两个表的连接,那么内存限制可能没有那么糟糕,但通常是三个或更多的表,因此值得进行不同的查询。


写在最后

用过Laravel吗?还记得 Eloquent ORM模型吗?

不知道有没有注意到,debug所打印出来的多表联合查询,

都是拆分为“单个表查询”,然后使用PHP处理的。

Happy coding :-)


是做表连接查询还是做分解查询要具体情况具体分析。

如果数据库的结构合理,索引设计得当,表连接的效率要高于分解查询。比如,在有外键的时候,数据库可以为外键建表并建立索引从而提升多个表连接查询的效率。另外,多表连接查询不需要把数据传输到应用程序中,直接在数据库端执行,这在很大程度上提升了效率。

但是多表连接也有一些缺点。多表连接对表结构的依存度很高,只要表结构出现变更就会同时对数据库检索和应用处理两个部分产生较大影响。另外,多表连接的兼容性不好,数据库不同SQL文也多少有些差异。而且采用分散数据库的时候,实现多表连接即麻烦又没有什么好处。因此,一些大型系统或者是支持多种类数据库的系统一般不会使用多表连接,而倾向于采用分解查询。

这个得看情况,一般数据不大的情况下多表连接查询和多次单表查询的效率差不多。如果数据量足够大,那肯定是多次单表查询的效率更高。在很多大的公司里面,都会禁用多表连接查询,原因就是一旦数据量足够大的时候多表连接查询效率会很慢,而且不利于分库分表的查询优化。那么看一下下面这个例子。

两种查询方式的比较

我这里有一个数据库,我们拿里面的客户表和地区表做两种查询的对比。用户表数据是31万条,地区表3511条。

1. 使用连表查询成都市的客户总数

2.使用多次单表查询客户总数

可以看到,查询出来的结果都是一样,但是第一种的连表查询用了0.67秒中,而第二种多次单表查询一共用时0.14秒。这个对比已经是很明显了吧。

虽然这只是一个很简单的例子,但是对比结果是非常明显的。在实际应用中可能会更复杂、数据更多,如果还使用连表查询时非常慢的,而且还消耗服务器资源。

所以现在在很多大了公司明确要求禁止使用join查询,比如阿里、腾讯就明确规定禁用三表以上的join查询。

总结一下,单表查询的优点

1. 多次单表查询,让缓存的效率更高。

许多应用程序可以方便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。

2. 将查询分解后,执行单个查询可以减少锁的竞争。

3. 在应用层做关联,更容易对数据库进行拆分,更容易做到高性能和可扩展。

4. 查询本身效率也可能会有所提升。

5. 可以减少冗余记录的查询。

6. 在应用中实现了哈希关联,而不是使用MySQL的嵌套环关联,某些场景哈希关联的效率更高很多。

7. 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。

8. 很多大公司明确规定禁用join,因为数据量大的时候查询确实很慢

所以在数据量不大的情况下,两种方式的查询都没什么明显的差别,使用多表连接查询更方便。但是在数据量足够大几十万、几百万甚至上亿的数据,或者在一些高并发、高性能的应用中,一般建议使用单表查询。

如果觉得笨猫的回答对你有用,点个关注,非常感谢。

java的,在orm框架下,分解查询是最符合面向对象操作的,挺支持分解查询的(拙见)

先说结论:不一定。

多表查询效率低的时候,可以考虑拆解sql成多个小的sql,至于效率是否一定会提高,这个还不一定,具体问题具体问题。当多表查询效率低的时候,拆解成单个小sql,这只是一个可能的思路,起不起作用,不一定。

sql是一个很复杂的东西,sql引擎会分析执行计划,并可能按照他认为最优的执行计划执行sql,但他认为的也不一定是正确的。不同的sql执行计划不一样,所以很难断定sql拆解或者合并的效率。

说了这么多,那到底是多表联合查询还是拆解呢?有没有一个原则? 有!如果你确定你的单个sql的执行效率比较快,当然可以写多个单个sql。当然了,具备这个能力需要你对数据库足够了解,比如什么时候走索引,什么时候nested loop等等。如果你现在的多表联合查询比较慢,你需要找出来慢的原因,并分析拆解后的sql的执行计划,看是否避免了多表联合查询的效率问题。


总之吧。这个问题,只能给你一个大体的思路,因为牵扯到很多基础问题,我觉得最起码sql执行计划应该需要了解,一个sql可能的执行计划有几十中,复杂sql的执行计划又是这几十种的组合。哪种效率低,哪种效率高应该有个大体了解。


多表查询可以很快,也可以很慢。主要看执行计划。

单次肯定是多表连接查询的效率高,但多次单表查询的吞吐量高,而且容易优化,例如分库分表,使用缓存减少DB访问次数等等,所以在大数据量高并发场景通常使用多次单表查询的方式。另外,不管是单表还是多表连接查询,SQL的执行时间和数据量、并发量都有很大关系,和扫描的数据行数也很有关系。如果一条SQL,平时执行一次要2秒,10个并发时,系统可能一点问题都没有,1000个并发时,数据库可能就被拖死了。我们组之前碰到过好几次这种问题,一张只有几万条数据的表,因为忘记加索引,平时执行只有几百毫秒,高峰期直接飙到几十秒,DB差点被拖垮。

单纯从效率来讲,join的表不太多时,join效率比较高。但是占用的主要是数据库服务器的资源。数据库资源又是个瓶颈,不易横向扩展。所以在数据量大的时候,我们会采用单表查询,把循环和匹配等大量工作移到应用服务器上。应用服务器容易扩展,对并发支持更好。

当数据量大到千万级以上,就建议尽可能减少join,鼓励使用单表查询。查询优化比较容易。这时候使用join的一个大型查询就可能花很久,对其他查询造成阻塞,导致服务不可用。

当考虑单表查询后,就会衍生一系列的策略,比如冷热数据分离,将热数据和 历史 数据分离,大幅降低数据量级以提高热数据查询性能,并可以使用内存缓存。这样又促使你考虑引入微服务架构。

总结,数据量小,查询并发少,那么使用join的性能是可控的,开发成本低。当数量级上升到千万级且不断增加,尽早考虑向单表查询切换,否则可能有性能下降会导致系统奔溃。而且性能下降不是线性的,会陡降。

③ 数据库的多表大数据查询应如何优化

1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:x0dx0aselect id from t where num is nullx0dx0a可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:x0dx0aselect id from t where num=0x0dx0a2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。x0dx0a3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:x0dx0aselect id from t where num=10 or num=20x0dx0a可以这样查询:x0dx0aselect id from t where num=10x0dx0aunion allx0dx0aselect id from t where num=20x0dx0a4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:x0dx0aselect id from t where num in(1,2,3)x0dx0a对于连续的数值,能用 between 就不要用 in 了:x0dx0aselect id from t where num between 1 and 3x0dx0a5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。 x0dx0a见如下例子: x0dx0aSELECT * FROM T1 WHERE NAME LIKE ‘%L%’ x0dx0aSELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’ x0dx0aSELECT * FROM T1 WHERE NAME LIKE ‘L%’ x0dx0a即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。x0dx0a6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:x0dx0aselect id from t where num=@numx0dx0a可以改为强制查询使用索引:x0dx0aselect id from t with(index(索引名)) where num=@numx0dx0a7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:x0dx0aSELECT * FROM T1 WHERE F1/2=100 x0dx0a应改为: x0dx0aSELECT * FROM T1 WHERE F1=100*2x0dx0aSELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’ x0dx0a应改为: x0dx0aSELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’x0dx0aSELECT member_number, first_name, last_name FROM members x0dx0aWHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21 x0dx0a应改为: x0dx0aSELECT member_number, first_name, last_name FROM members x0dx0aWHERE dateofbirth < DATEADD(yy,-21,GETDATE()) x0dx0a即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。x0dx0a8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:x0dx0aselect id from t where substring(name,1,3)='abc'--name以abc开头的idx0dx0aselect id from t where datediff(day,createdate,񟭅-11-30')=0--‘2005-11-30’生成的idx0dx0a应改为:x0dx0aselect id from t where name like 'abc%'x0dx0aselect id from t where createdate>=񟭅-11-30' and createdate<񟭅-12-1'x0dx0a9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。x0dx0a10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。x0dx0a11.很多时候用 exists是一个好的选择:x0dx0aelect num from a where num in(select num from b)x0dx0a用下面的语句替换:x0dx0aselect num from a where exists(select 1 from b where num=a.num)x0dx0aSELECT SUM(T1.C1)FROM T1 WHERE( x0dx0a(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0) x0dx0aSELECT SUM(T1.C1) FROM T1WHERE EXISTS( x0dx0aSELECT * FROM T2 WHERE T2.C2=T1.C2) x0dx0a两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

④ 数据库的多表大数据查询应如何优化

1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
3.应尽量避免在 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
4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。
6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
SELECT * FROM T1 WHERE F1/2=100
应改为:
SELECT * FROM T1 WHERE F1=100*2
SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’
SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改为:
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11.很多时候用 exists是一个好的选择:
elect num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

⑤ 对于多表关联的,大数据分页,怎么整sql

SELECT*
FROM(SELECT查询字段,
ROW_NUMBER()OVER(ORDERBY排序字段)ASNum
FROM表专1a
INNERJOIN表2bONa.关联字属段=b.关联字段
)t
WHEREt.NumBETWEEN10AND20

⑥ 请教专家:oracle大数据量一对多表查询问题

实际情况可能会这样,表1有产品的名称,表2没有产品的名称。所以如内果在查询中,要包含表容1中的字段的话,就要用到关联,所以最好,将表1和表2都在ID上建索引。再关联;如果不包含表1的话,只需给表2建索引。
根据这里的环境来看,走索引会比走全表扫描来的快些。

然后可以在SQLPLUS环境下,启动跟踪功能,查看这个语句的执行计划情况

SQL优化方面,可以参考oracle性能调整方面的书籍

以上参考!

⑦ SQL SERVER 2008跨数据库大数据多表联查

描述不清,不过大概能理解。
给点建议。大数据量表在做非主键或有索引列查询时,采用有主键或索引列查询并将一级结果保存至公有临时表中。再进行二级查询。

⑧ mysql执行多表查询,大数据,sql该怎么写

使用连接(JOIN)来代替子查询(子查询)选择最合适的字段属性使用联合(UNION),以取代临时表使用手动创建使用事务外键索引使用避免使用会非常优化来优化查询

⑨ 如何提高mysql大数据多表查询速度

见索引,还有就是在取数据的时候,分批次取数据。
ps = (PreparedStatement) con.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ps.setFetchSize(Integer.MIN_VALUE);
ps.setFetchDirection(ResultSet.FETCH_REVERSE);

阅读全文

与大数据多表相关的资料

热点内容
win10台式网络无法连接无线网络 浏览:20
jsp导出document 浏览:846
win10kb3156421更新失败 浏览:697
一键影音win10 浏览:965
昭通饮品批发哪个网站比较实惠 浏览:434
怎么批量提取多个Excel文件 浏览:947
jsp判断是否为数字 浏览:56
杰伦的歌在哪个app上 浏览:89
qq头像心的 浏览:463
我国航天发射用的什么数据库 浏览:453
win10steam打字没字母 浏览:805
csgo启动文件是哪个文件夹 浏览:578
linux必会命令 浏览:940
哪个培训机构有编程 浏览:923
自动生成css代码 浏览:808
数据库与硬盘 浏览:202
网络名字叫什么好听 浏览:798
excel恢复隐藏的文件恢复 浏览:1
调查问卷的数据怎么加注释 浏览:192
openivwin10 浏览:181

友情链接