MySQL數據庫之多條件查詢索引實現(項目中常常用到)

案例:當咱們在進行列表查詢的時候,會有不少條件,但並非全部條件咱們都會在一塊兒查詢都使用到,也不知道有哪一個條件必定會使用,這讓mysql的以列的左前綴的索引方式顯得有些力不從心,加入有六個條件,咱們總不能寫6*5*4*3*2*1個索引吧,這樣太浪費資源,並且十分費事,如何解決呢。mysql

例子:加入咱們有一個學生成績表,有grade (1~6年級),姓名(name),學科(subject 數、語文、英語),成績區間查詢(score 150分滿分),家庭住址(address),性別(sex)sql

當咱們查這些時,咱們使用這些條件時,會出現這些查詢:排序

三年級的數學及格的成績信息索引

全部低於30分的成績信息資源

想查「張三」這位學生的全部學科信息。數學

查年齡在「6-12」歲全部人的數學成績信息。select

根據MySQL最左前綴咱們如何選擇第一列的選項,根據狀況而定,可能根據需求每一個頻率都會用到,咱們如何創建索引,創建過多的索引會給系統增長很大的負擔,並且並不實用。數據

解決問題:查詢

    以學科舉例,若是某個查詢不限制性別,那麼能夠經過在查詢條件中新增 and sex in(0,1)來讓Mysql使用索引。英語

    訣竅將查詢條件分爲幾部分,在查詢時用select框體的(選擇列明顯就是數量不多),區間查詢,模糊查詢。

    一般狀況下應該以select選擇最小的作最左邊。從左到右依次是sex(2),subject(3),grade(6)

    而後在一區間進行查詢score使用between()進行操做。

    而後是進行模糊查詢,有name和adress,不少狀況下,查name咱們就查姓必須有的模糊查詢(即符合最左前綴),那麼就應該是先name後adress,由於adress是使用like "%%"方式,是沒法使用索引的,放在最後面,或者在索引中不加入此列。

    因此使用索引應該爲sex,subject,grade,score,name。

    爲何要把sex放在前面呢,加入數據有1000條,那麼男,女可能應該在500左右。而subject有三課,那麼每條數據應該有330條左右。以前咱們提到說在索引的排序上,在不考慮排序,group by問題時,最好用選擇性高的列放在前方,那爲何這時要用性別作第一列呢。由於咱們說索引的時候常常是以「=」號來考慮問題的,如今若是不選sex選項,咱們只能使用in,使用in的話就會增長組合。假如sex,subject,grade咱們都不選的話,那麼就會有2*3*6=36種組合。因此常常會有人聽到說寫sql的時候儘可能少使用in多使用between來減小組合。可是凡事都有量級,若是組合數達到上千個須要特別當心,在有些場景中若是沒法避免,而且組合數較少的狀況下,那麼盡情的使用in吧。

    那爲何要把between and放在select的後面呢,由於between and 是範圍查詢,若是放在前面,後面的索引列就使用不了了。

   因此在explian上的時候,in()和>,<,between and都顯示的是type:range,實際上是有區別的,區別在於使用in以後,叫作「多個等值條件查詢」,後面的索引列是能夠繼續使用索引的,可是「值的範圍查詢」(>,<,between and)後面的字段是沒法使用索引的!!

相關文章
相關標籤/搜索