这个就要具体问题具体分析了。
我也不想去给你网上找一大堆别人写的,那些我看了也晕。
我觉得这个必须要自己在实际的SQL练习或者项目中去体会。
没有固定要用什么方式。
初学者实现就行,但是数据库管理员要做的更多是考虑效率问题。
那说说你问的这个。
总的来说查询都是简单为好,复杂的嵌套,会影响效率。
基本就是用 SELECt * FROM TABLE WHERe 条件这样的简单查询。
而嵌套和链接都可以试情况而定的。
比如我要写一个查询表一表二ID对应,并且表二其中一个字段分数SCORE值>60,的记录。
那么SELECt * FROM TABLE1 WHERe ID IN(SELECt id FROM TABLE2 WHEReSCORE>60) 这个是嵌套。
同样的查询,我用连接也可以 SELECt A.* FROM TABLE1 A,TABLE2 B WHERe A.ID=B.ID AND B.SCORE>60.又或者SELECt A.* FROM TABLE1 A INNER JION TABLE2 B ON A.ID=B.ID WHERe B.SCORE>60.这些都看具体情况而定的,没有什么固定的方式。
数据库(比如MYSQL),表连结查询与子查询哪个效率高些?为什么多表连接查询和多次单表查询哪个效率高?为什么?如果数据量小的表,这样的设计意义不大,而且当然是单表速度快。
若在大数据量情况下,设计非常有意义。
在多表连接中注意数据的条目和外健,避免出行大量冗余数据导致性能下降。
下面我以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个连接的单个查询查询:8.074508秒结果大小:2268000一行5个查询组合查询时间:0.00262秒结果大小:165 (6 + 50 + 7 + 12 + 90)注意,我们在两种情况下得到了相同的结果(6 x 50 x 7 x 12 x 90 = 2268000)总结一下对于冗余数据,左连接使用更多的内存。
如果只执行两个表的连接,那么内存限制可能没有那么糟糕,但通常是三个或更多的表,因此值得进行不同的查询。
写在最后用过Laravel吗?还记得 Eloquent ORM模型吗?不知道有没有注意到,debug所打印出来的多表联合查询,都是拆分为“单个表查询”,然后使用PHP处理的。
Happy coding :-)我是@程序员小助手,持续分享编程知识,欢迎关注。



