鍍金池/ 問(wèn)答/Java  數(shù)據(jù)庫(kù)/ Oracle:多個(gè)查詢條件時(shí)如何添加索引

Oracle:多個(gè)查詢條件時(shí)如何添加索引

現(xiàn)有表Student包含ID、Name、Gender、Birthday字段(其中ID為主鍵)

查詢Student時(shí)可分別根據(jù)這四個(gè)條件任意組合

當(dāng)數(shù)據(jù)量很大時(shí)查詢會(huì)很慢,該如何創(chuàng)建索引呢?

需要為Name、Gender、Birthday字段也分別創(chuàng)建索引嗎?

或者我該看下什么文章來(lái)幫助解決這個(gè)問(wèn)題呢?謝謝。


1、數(shù)據(jù)量超過(guò)2000W
2、查詢一次大約需要20秒
3、條件任意組合,這里僅以NAME、GENDER作為條件,每頁(yè)10條

SELECT * FROM (SELECT ROWNUM RN, ID, NAME, GENDER, BIRTHDAY FROM (SELECT NUM FROM STUDENT WHERE NAME='小明' AND GENDER='01') WHERE ROWNUM <= 20) WHERE RN >= 10;

回答
編輯回答
枕邊人

gender字段只有兩個(gè)值,不建議創(chuàng)建索引。
Name,Gender字段的不同值多,建議創(chuàng)建索引。

另外大數(shù)據(jù)量查詢慢的問(wèn)題,比較常用的做法就是做分頁(yè)處理,具體寫法自己搜索一下。


分頁(yè)的sql語(yǔ)句建議:
1、ROWNUM <= 20的條件,最好能放到最內(nèi)層的sql語(yǔ)句的where條件中
2、可以嘗試一下IN 的用法,如:

SELECT * FROM (
    SELECT ROWNUM RN, ID, NAME, GENDER, BIRTHDAY FROM STUDENT 
    WHERE ID IN (
        SELECT ID FROM STUDENT WHERE NAME='小明' AND GENDER='01' AND ROWNUM <= 20
    )
)
WHERE RN > 10;

另外, 把oracle的執(zhí)行計(jì)劃發(fā)出來(lái),方便看執(zhí)行過(guò)程。

2018年4月19日 10:39