從大廠不允許使用 SELECT 說開去

2021-10-25 04:56:23 字數 1799 閱讀 7576

作為開發人員資料庫查詢語句我們經常用到,但是你是否想過為什麼大廠都會強制開發人員禁止使用 select * 語句?你一定會說因為效率低啊,多差除了一些無用的資料。如果是這麼想的,那就繼續聽我來說。

零、**原因

1. 表象層面

2. 索引層面

上面所說的只是從表象層面來說的,這些我們都能看得到感受得到。下面我們從 mysql 的索引層面來說一下。使用 select * 會造成 mysql 優化器的覆蓋索引策略失效,這個策略在業內又是被公認為速度和效率都是極好的,那麼這樣一來這個優秀的策略就無用武之地了。那麼為什麼說覆蓋索引策略是極好的呢,下面我們通過乙個例子來講解一下。

2.1 單例索引

我們的資料庫中存在一張表 emp,表中包含 id,name,***,birthday 字段,其中 id 是主鍵,*** 存在索引。這時磁碟上就存在兩個 b+ 樹,一棵是主鍵索引樹(聚集索引)保整行內容,另一棵是 *** 索引樹(輔助索引)儲存 id 和 ***內容。當我們通過希望 where 語句查詢出 *** 等於男的資料時,那麼where 條件可以通過 *** 索引過濾掉不符合要求的資料,如果使用者只想獲取 *** 和 id 欄位的資料的話,*** 索引就可以直接返回所需的資料,這種情況時極好的。如果我們的查詢語句是 select * 的話,那麼 mysql 通過 *** 索引樹過濾出資料後,還要再去主鍵索引樹上去拿到符合條件的所有欄位的內容,這樣就多了一次索引樹的查詢,進而降低了查詢速度。在這裡需要注意的是:我們在開發中輔助索引的數量往往大於聚集索引的數量,那麼利用輔助索引去進行查詢的時候是從記憶體中直接讀取資料的,聚集索引有時會去讀取磁碟這樣就出現了拆查詢緩慢的問題。

2.2 聯合索引

前面我們提到了輔助索引,輔助索引一般包含單列索引和聯合索引。單列索引就是我們前面所講的 *** 索引,下面我們重點講解一下聯合索引。所謂的聯合索引就是多個字段聯合在一起,這是我們所知道的。但是大部分開發人員所不知道的是聯合多因其實是建立了多個索引,比如我們將上例中的 name、***、birthday 三個欄位做乙個聯合索引,那麼在資料庫中實際上是建立了三個索引,分別是:name 索引,***_name 索引、***_name_birthday 索引 (注意:這裡只是為了看起來易讀,實際資料庫索引命名不是這樣的)。

講到這裡我問各位讀者乙個小問題:where name='***' and birthday ='2019-01-01'這個語句使用了上面三個索引中的哪些?肯定會有讀者說用到了 name 索引和***_name_birthday 索引,真的是這樣嗎?我們不妨先來看看 mysql 中索引的使用規則,我們可以把索引看成一本詞典,name、***、birthday 分別是這本辭海的字母、字和詞,如果我們想要查詢字(***)的時候就需要知道這個字的以什麼字母(name)開頭,如果我們要查詢詞(birthday )的時候就需要知道這個此是以什麼字(***)開頭,這個開頭的字(***)是以什麼字母(name) 開頭的。這麼一說你應該就明白了吧,前面所問的那個問題的答案就是只用到了 name 索引,這是因為 birthday 位於 ***_name_birthday 索引 我們無法跨過 ***_name 索引去查詢它,就像我們無法通過字母去查詢某個詞一樣。

講了這麼多我們來總結一下使用聯合索引的好處。首先它可以減少開銷,當我們建立了乙個聯合索引就相當於建立了多個索引,我們知道多建立乙個索引就會增加磁碟和操作開銷,但是使用聯合索引則會減少這些開銷。其次可以實現索引覆蓋,mysql 可以通過遍歷索引直接獲取到資料,進而減少了回表的操作和 io 操作。最後通過聯合索引可以在篩選出符合條件的資料的同時提高查詢效率。

2.3 建立索引的注意事項

當然並不是說任何情況下都適合建立索引,下面列出了不適合建立索引的情況。

一、總結

MySQL不允許從遠端訪問

以下是引用內容 error 1130 host 192.168.1.3 is not allowed to connect to this mysql server 解決方法 1。改表法。可能是你的帳號不允許從遠端登陸,只能在localhost。這個時候只要在localhost的那台電腦,登入mys...

解決MySQL不允許從遠端訪問的方法

1。改表法。可能是你的帳號不允許從遠端登陸,只能在localhost。這個時候只要在localhost的那台電腦,登入mysql後,更改 mysql 資料庫裡的 user 表裡的 host 項,從 localhost 改稱 mysql u root p mysql use mysql mysql u...

解決MySQL不允許從遠端訪問的方法

首先更改my.cnf檔案,若有bind繫結的ip,把這一句注釋掉。然後修改使用者的登入許可權 1 改表法。可能是你的帳號不允許從遠端登陸,只能在localhost。這個時候只要在localhost的那台電腦,登入 mysql後,更改 mysql 資料庫裡的 user 表裡的 host 項,從 loc...