access如何查询两张表的内容_为什么可以的话,不要使用星号 *,而是相应的字段名来进行查询 MySQL内连接如何选择驱动表
參考:
掘金小冊?juejin.im首先要了解單表查詢方法,也就是explain中出來的,ref,index,const,all之類的。
然后了解index查詢方法,也就是在聯合索引中,條件不是第一個索引,但是查詢的剛好是這聯合索引的幾個列。這樣就直接命中了這個聯合索引產生的二級索引表,二級索引里面是索引和主鍵。
這樣的話,我們可以直接通過遍歷二級索引的葉子節點,根據后面的條件來把符合條件的列進行返回。
比如:建立聯合索引 key_part1, key_part2, key_part3 ,然后進行下面的查詢
SELECT key_part1, key_part2, key_part3 FROM single_table WHERE key_part2 = 'abc';
根據前面的方式進行查詢,這樣就不用回表了,也就是不需要到主鍵的聚族索引里再查一次了,這樣就很快。這就是index的查詢方法。
然后是:
為什么可以的話,不要使用星號 *,而是相應的字段名來進行查詢
使用*號會把笛卡兒積全部返回,如果只使用字段的話,說不定可以剛好命中聯合索引(感覺自己解釋地差強人意,感覺還是看下面的別人的吧。。。)
還有一個是 基于塊的嵌套循環連接(Block Nested-Loop Join)的 join buffer的使用中,使用buffer存儲驅動表的列,這樣被驅動表中的記錄從硬盤中取出來后可以一次性匹配驅動表中的條件。而放在buffer中的列是查詢的列和條件中的列,所以如果查詢的是*,那么buffer的大小就會很大。所以只要把需要的列進行添加即可,盡量不使用*。
參考:https://www.cnblogs.com/juncaoit/p/7764184.html
- 使用星號(*)可能會返回不使用的列的數據。 它在MySQL數據庫服務器和應用程序之間產生不必要的I/O磁盤和網絡流量。
- 如果明確指定列,則結果集更可預測并且更易于管理。 想象一下,當您使用星號(*)并且有人通過添加更多列來更改表格數據時,將會得到一個與預期不同的結果集。(我覺得這個是比較關鍵的)
- 使用星號(*)可能會將敏感信息暴露給未經授權的用戶
這個也值得注意一下,就是MySQL在內連接時如何選擇驅動表的問題,這里使用數據量小的為驅動表,我想著應該和前面的join buffer有關系,這樣可以盡量一次把驅動表的數據一次性加載到內存里面。但是如果是 Nested-Loop Join的話,這樣就類似與兩個for循環的嵌套了。
https://blog.csdn.net/qq_20891495/article/details/93744495?blog.csdn.net這里講得挺好的。
主要是要理解
這里面的連接是什么。程序上來看就是內循環的次數,實際表現就是訪問被驅動表的次數。
外循環是訪問驅動表,直接單表訪問即可。內循環的次數就是訪問被驅動表的次數,也就是上面說的連接數。
比較抽象,看不懂就別看了。
歡迎批評指正。
總結
以上是生活随笔為你收集整理的access如何查询两张表的内容_为什么可以的话,不要使用星号 *,而是相应的字段名来进行查询 MySQL内连接如何选择驱动表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 资金链断裂是什么意思
- 下一篇: 预先披露更新离上市还有多久