1. sql语句多表联查,查询速度太慢,超过10s,由于是菜鸟,不知道怎样优化
确定是菜鸟,sql 写成这样 证明你逻辑很清楚啊,建议如孙燃巧果是初学者,代码规范一定要保持则键
不知道代码规范,可以去窗口format一下。。。
言归正传 你段基这个优化的话 可以把
AND p.mediatypeinfoid in (
select
id
from
fn_get_mediatype_infor(5)
)
上面这部分 换成 inner join
2. SQL连表查询跟一个个表查询那个快各有什么优点和缺点
一般情况下是一条语句来的快。如果表2的数据比表1多出几个数量级的话,并且表2中该id字段有索引,则有可能使用多次查询会快点。
一次查询的优点是只轿拆此需要一次连接,数据库查询的时候御粗,连接是个耗时的操作。缺点是如果两个表数据多,则中间结果集太大,需要较多的内存资源。
多次查询的优缺点和一次查询正好反过来。另外多次查询也可以在程序中对每一次查询的中间结果做处理,这是一个灵活性。
3. 大量数据多表联合查询时时, 使用视图,是不是比直接查询速度要快! 有高手请给讲讲,如何提高查询速度
1、简化应用程序。
视图做为数据库中的一种实体,实际上存在的只是它的脚本,而它的内容并不真正的单独存在一份。一般,可以对复杂的应用程序从功能角度进行分析,将可以与其它的应用程序共用的那一部分,分离出来。对这部分功能,视具体情况可做成不同的数据库实体(如过程),有些是可以做成视图的。这样,上层的应用程序就可以从视图中取数据了。还有,可以把对远地数据库的访问封装在视图中,使之对上层应用程序透明。2、可以对 UNION 后的记录集排序。
直接对以下语句的结果排序,是不可能的。 select a.id id from a
union
select b.id id from b;
所以把以上语句作成视图后,就可以了。设视图名为A_B:
select id from A_B order by id;3、可以实现一定的权限控制。
可以根据需要,对表中的一部分内容做一个视图,以供一定的角色使用。可以对表中的一部分记录做一个视图(纵向),也可以对一个表中的一部分字段做一个视图(横向),或二者兼而有之。--------------------------------------------------------------------
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。一、视图的作用 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:使用权限可被限制在基表的行的子集上。
使用权限可被限制在基表的列的子集上。
使用权限可被限制在基表的行和列的子集上。
使用权限可被限制在多个基表的连接所限定的行上。
使用权限可被限制在基表中的数据的统计汇总上。
使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。二、视图的优点 (1)视图能简化用户的操作
(2)视图机制可以使用户以不同的方式查询同一数据
(3)视图对数据库重构提供了一定程度的逻辑独立性
(4)视图可以对机密的数据隐氏好提供安全保护三、视图的安全性视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下: 1 在表中增加一个标志用户名的列;
2 建立视图,是用户只能看到标有自己用户名的行;
3 把视图授权给其他用户。四、逻辑数据独立性 视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立: 1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。
2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图灶铅屏蔽应用的变化,从而使数据库表不动。
3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。
4 如果应用建立在视图核桐上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。五、视图的书写格式 CREATE VIEW <视图名>[(列名组)]
AS <子查询>
DROP VIEW <索引名> 注意:视图可以和基本表一样被查询,但是利用视图进行数据增,删,改操作,会受到一定的限制。(1)由两个以上的基本表导出的视图
(2)视图的字段来自字段表达式函数
(3)视图定义中有嵌套查询
(4)在一个不允许更新的视图上定义的视图
4. mysql多表连接查询很慢,有更好的解决方案吗
设备运行数据表才千万级,说明实时数据量应该不会太大,为什么不再建立一个实时数据表(当然如果有需要,这个表你也可以按区域之类的分表),表中就三字段,比如就设备ID,区域ID(这以两个为唯一索引)和当前最大monitor_value,然后在设备运行数仔乎据表中建立触发器,当插入新数据时就去更新那个实时数据表(或者说如果设备ID区域ID没出现就新建,如果有并且数据念饥悉比那个还大肢皮就更新)
5. SQL连表查询跟一个个表查询那个快各有什么优点和缺点
SQL连表查询称为联合查询,一个个表查询是单查询。两者的区别和优缺点如下:
1、从开发效率来看:
联合查询是需要多个单查询进行逻辑组合才能完成的查询的工作,联合查询仅仅需要一个SQL就可以完成查询工作,即把业务逻辑放到了SQL中,由数据库来处理,相对来说开发效率会比较高些。
2、从查询效率来看:
单查询的可重用性较高,所以效率相较之联合查询会更高。
在数据库进行读写时,数据库会用锁机制,限制其他连接对其操作。由于联合查询查询速度比单个查询要慢很多,这样联合查询会增加锁的竞争关系,所以用单查询会更好。
3、从逻辑架构分层原则来看
关联关系代表了业务规则/逻辑,如果大量使用缓凯关联查询,就是把大量的业务规则和逻辑放在迅镇数据库来执行了,数据库消耗cpu、内存、io等资源会大大增加。
4、从资源利用率方面看
大部分场景下,并不是所有关联查询的结果亩哪粗都被有效使用了。例如后台管理的列表界面会分页显示,关联查询的结果集,只有当前页的数据被使用,但数据库需要消耗额外资源得到全部结果集。
5、从架构的伸缩性方面看
大量的关联查询会导致集中式的数据库架构很难向分布式架构转换,伸缩性方面的优化难度高。关联查询方便快速,开发效率比较好。
不使用关联查询在架构层面有很多优点,但对系统分析和设计、开发能力要求高。一般在互联网行业等用户数较多的情况下最好重视这方面。
题主的两个查询由于数据量不多,效率上基本没有差别,但在实际应用中要根据数据量、业务复杂度等去综合评估。
6. 多表连接查询和多次单表查询哪个效率高为什么
如果数据量小的表,这样的设计意义不大,而且当然是单表速度快。若在大数据量情况下,设计非常有意义。在多表连接中注意数据的条目和外健,避免出行大量冗余数据导致性能下降。下面我以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的性能是可控的,开发成本低。当数量级上升到千万级且不断增加,尽早考虑向单表查询切换,否则可能有性能下降会导致系统奔溃。而且性能下降不是线性的,会陡降。
7. C# 多表连接 多次访问数据库 哪个快
1、数据少,怎么都可以,对速度没有多少影响(主要是感觉不出来)
2、数散脊族据多,多表连接查询野兄比多次查询快些,多次查询需要多次调用类进行操作,而多变连接查询,只需要调用一次类,冲弊但是两种情况下都需要一定时间,建议查询时采用线程休息命令,给出提示,Thread.sleep(200)等,让查询设计更加人性
8. 如何加快数据库连接速度
1、升级硬件
2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
3、扩大服务器的内存
4、增加服务器CPU个数
5、对于大的数据库不要设置数据库自动增长,它会降低服务器的性能
6、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
7、查询时不要返回不需要的行、列
8、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
9、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数
10、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:
select的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
11、一次更新多条记录比分多次更新每次一条快,就是说批处理好.
9. 如何优化数据库的连接速度和查询速度
1.合理使用索引
索引是数据库中重要的晌雀数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使迟察用要恰到好处,其使用原则如下:
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
●索引中不包括一个或几个待排序的列;
●group by或order by子句中列的次序与索引的次序不一样;
●排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询。
4.避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式
MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语码谨茄句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
6.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在临时表中查询:
SELECT * FROM cust_with_balance
WHERE postcode>“98000”
临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
7.用排序来取代非顺序存取
非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。
有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。(由速拍学区房提供)