⑴ 如何優化sql語句,怎麼加索引
1、主鍵就是聚集索引2、只要建立索引就能顯著提高查詢速度3、把所有需要提高查詢速度的欄位都加進聚集索引,以提高查詢速度(四)其他書上沒有的索引使用經驗總結1、用聚合索引比用不是聚合索引的主鍵速度快2、用聚合索引比用一般的主鍵作orderby時速度快,特別是在小數據量情況下3、使用聚合索引內的時間段,搜索時間會按數據占整個數據表的百分比成比例減少,而無論聚合索引使用了多少個4、日期列不會因為有分秒的輸入而減慢查詢速度(五)其他注意事項1.不要索引常用的小型表2.不要把社會保障號碼(SSN)或身份證號碼(ID)選作鍵3.不要用用戶的鍵4.不要索引memo/notes欄位和不要索引大型文本欄位(許多字元)5.使用系統生成的主鍵二、改善SQL語句1、Like語句是否屬於SARG取決於所使用的通配符的類型2、or會引起全表掃描3、非操作符、函數引起的不滿足SARG形式的語句4、IN的作用相當與OR5、盡量少用NOT6、exists和in的執行效率是一樣的7、用函數charindex()和前面加通配符%的LIKE執行效率一樣8、union並不絕對比or的執行效率高9、欄位提取要按照「需多少、提多少」的原則,避免「select*」10、count(*)不比count(欄位)慢11、orderby按聚集索引列排序效率最高12、高效的TOP
⑵ sql如何建立降序索引 和刪除索引
建立降序索引語法:
createindex索引名on表名(欄位名desc);
註:desc換成asc則是升序索引。
刪除索引語法:
dropindex索引名;
(2)sql索引日期擴展閱讀:
索引的使用及注意事項御嘩
盡量避免這些不走索引的sql:
1、SELECT `sname` FROM `stu` WHERE `age`+10=30;不會使用索引,因為所有索引列參與了計算。
2、SELECT `sname` FROM `stu` WHERE LEFT(`date`,4) <1990; 不會使用索引,因為使用了函數運算,原理與上面相同。
3、SELECT * FROM `hounwang` WHERE `uname` LIKE'後盾%' 走索引。
4、SELECT * FROM `hounwang` WHERE `uname` LIKE "%後盾%"不走索引。鎮兆行
5、字元串與數字比較不使用索引;
CREATE TABLE `a` (`a` char(10));
EXPLAIN SELECT * FROM `a` WHERE `a`="1"走索引。
EXPLAIN SELECT * FROM `a` WHERE `a`=1 不猜局走索引
參考資料:網路索引
⑶ oracle查看sql有日期區間如何走索引
你可以選中所有的區間,然後點擊左上角的,所以目錄就可以了。
⑷ sql怎麼建立索引
進入查詢窗口後,輸入下面的語句:x0dx0ax0dx0aCREATE INDEX mycolumn_index ON mytable (myclumn)x0dx0ax0dx0a這個語句建立了一個名為mycolumn_index的索引。你可以給一個索引起任何名字,但你應該在索引名中包含所索引的欄位名,這對你將來弄清楚建立該索引的意圖是有幫助的。x0dx0ax0dx0a注意:x0dx0ax0dx0a在本書中你執行任何SQL語句,都會收到如下的信息:x0dx0ax0dx0aThis command did not return data,and it did not return any rowsx0dx0ax0dx0a這說明該語句執行成功了。x0dx0ax0dx0a索引mycolumn_index對表mytable的mycolumn欄位進行。這是個非聚簇索引,也是個非唯一索引。(這是一個索引的預設屬性)x0dx0ax0dx0a如果你需要改變一個索引的類型,你必須刪除原來的索引並重建 一個。建立了一個索引後,你可以用下面的SQL語句刪除它:x0dx0ax0dx0aDROP INDEX mytable.mycolumn_indexx0dx0ax0dx0a注意在DROP INDEX 語句中你要包含表的名字。在這個例子中,你刪除的索引是mycolumn_index,它是表mytable的索引。x0dx0ax0dx0a要建立一個聚簇索引,可以使用關鍵字CLUSTERED。)記住一個表只能有一個聚簇索引。(這里有一個如何對一個表建立聚簇索引的例子:x0dx0ax0dx0aCREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)x0dx0ax0dx0a如果表中有重復的記錄,當你試圖用這個語句建立索引時,會出現錯誤。但是有重復記錄的表也可以建立索引;你只要使用關鍵字ALLOW_DUP_ROW把這一點告訴SQL Sever即可:x0dx0ax0dx0aCREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)x0dx0ax0dx0aWITH ALLOW_DUP_ROWx0dx0ax0dx0a這個語句建立了一個允許重復記錄的聚簇索引。你應該盡量避免在一個表中出現重復記錄,但是,如果已經出現了,你可以使用這種方法。x0dx0ax0dx0a要對一個表建立唯一索引,可以使用關鍵字UNIQUE。對聚簇索引和非聚簇索引都可以使用這個關鍵字。這里有一個例子:x0dx0ax0dx0aCREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)x0dx0ax0dx0a這是你將經常使用的索引建立語句。無論何時,只要可以,你應該盡量對一個對一個表建立唯一聚簇索引來增強查詢操作。x0dx0ax0dx0a最後,要建立一個對多個欄位的索引——復合索引——在索引建立語句中同時包含多個欄位名。下面的例子對firstname和lastname兩個欄位建立索引:x0dx0ax0dx0aCREATE INDEX name_index ON username(firstname,lastname)x0dx0ax0dx0a這個例子對兩個欄位建立了單個索引。在一個復合索引中,你最多可以對16個欄位進行索引。x0dx0ax0dx0a用事務管理器建立索引x0dx0ax0dx0a用事務管理器建立索引比用SQL語句容易的多。使用事務管理器,你可以看到已經建立的索引的列表,並可以通過圖形界面選擇索引選項。x0dx0ax0dx0a使用事務管理器你可以用兩種方式建立索引:使用Manage Tables窗口或使用Manage Indexes窗口。x0dx0ax0dx0a要用Manage Tables 窗口建立一個新索引,單擊按鈕Advanced Options(它看起來象一個前面有一加號的表)。這樣就打開了Advanced Options對話框。這個對話框有一部分標名為Primary Key(見圖11.1)。x0dx0ax0dx0a圖11。1x0dx0ax0dx0a要建立一個新索引,從下拉列表中選擇你想對之建立索引的欄位名。如果你想建立一個對多欄位的索引,你可以選擇多個欄位名。你還可以選擇索引是聚簇的還是非聚簇的。在保存表信息後,索引會自動被建立。在Manage Tables窗口中的欄位名旁邊,會出現一把鑰匙。x0dx0ax0dx0a你已經為你的表建立了「主索引」。主索引必須對不包含空值的欄位建立。另外,主索引強制一個欄位成為唯一值欄位。x0dx0ax0dx0a要建立沒有這些限制的索引,你需要使用Manage Indexes窗口。從菜單中選擇Manage|Indexes,打開Manage Indexes 窗口。在Manage Indexes 窗口中,你可以通過下拉框選擇表和特定的索引。(見圖11.2)。要建立一個新索引,從Index下拉框中選擇New Index.,然後就可以選擇要對之建立索引的欄位。單擊按鈕Add,把欄位加人到索引中。x0dx0ax0dx0a圖11。2x0dx0ax0dx0a你可以為你的索引選擇許多不同的選項。例如,你可以選擇該索引是聚簇的還是非聚簇的。你還可以指定該索引為唯一索引。設計好索引後,單擊按鈕Build,建立該索引。x0dx0ax0dx0a注意:x0dx0ax0dx0a唯一索引是指該欄位不能有重復的值,而不是只能建立這一個索引。x0dx0ax0dx0aSQL核心語句x0dx0ax0dx0a在第十章,你學會了如何用SQL SELECT 語句從一個表中取數據。但是,到現在為止,還沒有討論如何添加,修改或刪除表中的數據。在這一節中,你將學習這些內容。x0dx0ax0dx0a插入數據x0dx0ax0dx0a向表中添加一個新記錄,你要使用SQL INSERT 語句。這里有一個如何使用這種語句的例子:x0dx0ax0dx0aINSERT mytable (mycolumn) VALUES (『some data')x0dx0ax0dx0a這個語句把字元串'some data'插入表mytable的mycolumn欄位中。將要被插入數據的欄位的名字在第一個括弧中指定,實際的數據在第二個括弧中給出。x0dx0ax0dx0aINSERT 語句的完整句法如下:x0dx0ax0dx0aINSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |x0dx0ax0dx0aValues_list | select_statement}x0dx0ax0dx0a如果一個表有多個欄位,通過把欄位名和欄位值用逗號隔開,你可以向所有的欄位中插入數據。假設表mytable有三個欄位first_column,second_column,和third_column。下面的INSERT語句添加了一條三個欄位都有值的完整記錄:x0dx0ax0dx0aINSERT mytable (first_column,second_column,third_column)x0dx0ax0dx0aVALUES (『some data','some more data','yet more data')x0dx0ax0dx0a注意:x0dx0ax0dx0a你可以使用INSERT語句向文本型欄位中插入數據。但是,如果你需要輸入很長的字元串,你應該使用WRITETEXT語句。這部分內容對本書來說太高級了,因此不加討論。要了解更多的信息,請參考Microsoft SQL Sever 的文檔。x0dx0ax0dx0a如果你在INSERT 語句中只指定兩個欄位和數據會怎麼樣呢?換句話說,你向一個表中插入一條新記錄,但有一個欄位沒有提供數據。在這種情況下,有下面的四種可能:x0dx0ax0dx0a如果該欄位有一個預設值,該值會被使用。例如,假設你插入新記錄時沒有給欄位third_column提供數據,而這個欄位有一個預設值'some value'。在這種情況下,當新記錄建立時會插入值'some value'。x0dx0a如果該欄位可以接受空值,而且沒有預設值,則會被插入空值。x0dx0a如果該欄位不能接受空值,而且沒有預設值,就會出現錯誤。你會收到錯誤信息:x0dx0aThe column in table mytable may not be null.x0dx0ax0dx0a最後,如果該欄位是一個標識欄位,那麼它會自動產生一個新值。當你向一個有標識欄位的表中插入新記錄時,只要忽略該欄位,標識欄位會給自己賦一個新值。x0dx0a注意:x0dx0ax0dx0a向一個有標識欄位的表中插入新記錄後,你可以用SQL變數@@identity來訪問新記錄x0dx0ax0dx0a的標識欄位的值。考慮如下的SQL語句:x0dx0ax0dx0aINSERT mytable (first_column) VALUES(『some value')x0dx0ax0dx0aINSERT anothertable(another_first,another_second)x0dx0ax0dx0aVALUES(@@identity,'some value')x0dx0ax0dx0a如果表mytable有一個標識欄位,該欄位的值會被插入表anothertable的another_first欄位。這是因為變數@@identity總是保存最後一次插入標識欄位的值。x0dx0ax0dx0a欄位another_first應該與欄位first_column有相同的數據類型。但是,欄位another_first不能是應該標識欄位。Another_first欄位用來保存欄位first_column的值。x0dx0ax0dx0a刪除記錄x0dx0ax0dx0a要從表中刪除一個或多個記錄,需要使用SQL DELETE語句。你可以給DELETE 語句提供WHERE 子句。WHERE子句用來選擇要刪除的記錄。例如,下面的這個DELETE語句只刪除欄位first_column的值等於'Delete Me'的記錄:x0dx0ax0dx0aDELETE mytable WHERE first_column='Deltet Me'x0dx0ax0dx0aDELETE 語句的完整句法如下:x0dx0ax0dx0aDELETE [FROM] {table_name|view_name} [WHERE clause]x0dx0ax0dx0a在SQL SELECT 語句中可以使用的任何條件都可以在DELECT 語句的WHERE子句中使用。例如,下面的這個DELETE語句只刪除那些first_column欄位的值為'goodbye'或 second_column欄位的值為 'so long'的記錄:x0dx0ax0dx0aDELETE mytable WHERE first_column='goodbyOR second_column='so long'x0dx0ax0dx0a如果你不給DELETE 語句提供WHERE 子句,表中的所有記錄都將被刪除。你不應該有這種想法。如果你想刪除應該表中的所有記錄,應使用第十章所講的TRUNCATE TABLE語句。x0dx0ax0dx0a注意:x0dx0ax0dx0a為什麼要用TRUNCATE TABLE 語句代替DELETE語句?當你使用TRUNCATE TABLE語句時,記錄的刪除是不作記錄的。也就是說,這意味著TRUNCATE TABLE 要比DELETE快得多
⑸ sql where條件後需要用日期進行索引
我可以發給你oracle語句調優和索引使用指南的文檔,應該對你有幫助,你的郵箱發一下吧
另外回答你的問題
1.在索引列上使用函數是很少能使用索引的,即使使用了索引函數也很難保證走索引,這就是oracle的內部的機制,在cbo之後,oracle以cost作為最優plan的標准,這方面的內容要說的話就多了,你可以參看我給的文檔,自己體會
2.在not,or類似這種非的查詢是不走索引的,你可以用join來避免not的用法。
有問題繼續追問
⑹ sql server 時間類型索引疑問
會,因為時間列的值一般選擇性較高(即重復值較少),這樣查詢優化器會先考慮用索引進行檢索
除非索引碎片達到一定等級,查詢優化器認為表掃描比索引查詢快時就不用了
還有,糾正你一點小問題,結束時間不要加00:00:00,這樣會將第二天的0點數據也包括在內
雖然概率很低,但情況存在
-------------------
你把列進行轉換就用不到索引了,因為轉換後的列值無論與數據頁還是緩存上存儲的都不一致
優化器需要重新掃描表並進行計算,所以一般對列進行函數操作再會慢
⑺ mysql分片,表關聯查詢的sql怎麼寫
以每24小時作為一份時間(而非自然日),根據用戶的配置有兩種工作模式:帶狀模式中,用戶僅定義開始日期時,從開始日期(含)開始,每份時間1個分片地無限增加下去;環狀模式中,用戶定義了開始日期和結束日期時,以結束日期(含)和開始日期(含)之間的時間份數作為分片總數(分片數量固定),以類似取模的方式路由到這些分片里。
1. DBLE 啟動時,讀取用戶在 rule.xml 配置的 sBeginDate 來確定起始時間
2. 讀取用戶在 rule.xml 配置的 sPartionDay 來確定每個 MySQL 分片承載多少天內的數據
3. 讀取用戶在 rule.xml 配置的 dateFormat 來確定分片索引的日期格式
4. 在 DBLE 的運行過程中,用戶訪問使用這個演算法的表時,WHERE 子句中的分片索引值(字元串),會被提取出來嘗試轉換成 Java 內部的時間類型
5. 然後求分片索引值與起始時間的差,除以 MySQL 分片承載的天數,確定所屬分片
1. DBLE 啟動時,讀取用戶在 rule.xml 配置的起始時間 sBeginDate、終止時間 sEndDate 和每個 MySQL 分片承載多少天數據 sPartionDay
2. 根據用戶設置,建立起以 sBeginDate 開始,每 sPartionDay 天一個分片,直到 sEndDate 為止的一個環,把分片串聯串聯起來
3. 讀取用戶在 rule.xml 配置的 defaultNode
4. 在 DBLE 的運行過程中,用戶訪問使用這個演算法的表時,WHERE 子句中的分片索引值(字元串),會被提取出來嘗試轉換成 Java 內部的日期類型
5. 然後求分片索引值與起始日期的差:如果分片索引值不早於 sBeginDate(哪怕晚於 sEndDate),就以 MySQL 分片承載的天數為模數,對分片索引值求模得到所屬分片;如果分片索引值早於 sBeginDate,就會被放到 defaultNode 分片上
與MyCat的類似分片演算法對比
中間件
DBLE
MyCat
分片演算法種類 date 分區演算法 按日期(天)分片
兩種中間件的取模範圍分片演算法使用上無差別
開發注意點
【分片索引】1. 必須是字元串,而且 java.text.SimpleDateFormat 能基於用戶指定的 dateFormat 來轉換成 java.util.Date
【分片索引】2. 提供帶狀模式和環狀模式兩種模式
【分片索引】3. 帶狀模式以 sBeginDate(含)起,以 86400000 毫秒(24 小時整)為一份,每 sPartionDay 份為一個分片,理論上分片數量可以無限增長,但是出現 sBeginDate 之前的數據而且沒有設定 defaultNode 的話,會路由失敗(如果有 defaultNode,則路由至 defaultNode)
【分片索引】4. 環狀模式以 86400000 毫秒(24 小時整)為一份,每 sPartionDay 份為一個分片,以 sBeginDate(含)到 sEndDate(含)的時間長度除以單個分片長度得到恆定的分片數量,但是出現 sBeginDate 之前的數據而且沒有設定 defaultNode 的話,會路由失敗(如果有 defaultNode,則路由至 defaultNode)
【分片索引】5. 無論哪種模式,分片索引欄位的格式化字元串 dateFormat 由用戶指定
【分片索引】6. 無論哪種模式,劃分不是以日歷時間為准,無法對應自然月和自然年,且會受閏秒問題影響
運維注意點
【擴容】1. 帶狀模式中,隨著 sBeginDate 之後的數據出現,分片數量的增加無需再平衡
【擴容】2. 帶狀模式沒有自動增添分片的能力,需要運維手工提前增加分片;如果路由策略計算出的分片並不存在時,會導致失敗
【擴容】3. 環狀模式中,如果新舊 [sBeginDate,sEndDate] 之間有重疊,需要進行部分數據遷移;如果新舊 [sBeginDate,sEndDate] 之間沒有重疊,需要數據再平衡
配置注意點
【配置項】1. 在 rule.xml 中,可配置項為 <propertyname="sBeginDate"> 、 <propertyname="sPartionDay"> 、 <propertyname="dateFormat"> 、 <propertyname="sEndDate"> 和 <propertyname="defaultNode">
【配置項】2.在 rule.xml 中配置 <propertyname="dateFormat">,符合 java.text.SimpleDateFormat 規范的字元串,用於告知 DBLE 如何解析sBeginDate和sEndDate
【配置項】3.在 rule.xml 中配置 <propertyname="sBeginDate">,必須是符合 dateFormat 的日期字元串
【配置項】4.在 rule.xml 中配置 <propertyname="sEndDate">,必須是符合 dateFormat 的日期字元串;配置了該項使用的是環狀模式,若沒有配置該項則使用的是帶狀模式
【配置項】5.在 rule.xml 中配置 <propertyname="sPartionDay">,非負整數,該分片策略以 86400000 毫秒(24 小時整)作為一份,而 sPartionDay 告訴 DBLE 把每多少份放在同一個分片
【配置項】6.在 rule.xml 中配置 <propertyname="defaultNode"> 標簽,非必須配置項,不配置該項的話,用戶的分片索引值沒落在 mapFile 定義
⑻ SQL SERVER中索引類型包括的三種類型分別是哪三種
三種索引類型分別是:
1、主鍵索引:不允許具有索引值相同的行,從而禁止重復的索引或鍵值。系統在創建該索引時檢查是否有重復的鍵值,並在每次使用 INSERT 或 UPDATE 語句添加數據時進行檢查。
2、聚集索引:指資料庫錶行中數據的物理順序與鍵值的邏輯(索引)順序相同。一個表只能有一個聚集索引,因為一個表的物理順序只有一種情況。
3、非聚集索引:索引中索引的邏輯順序與磁碟上行的物理存儲順序不同。非聚集索引的葉層不包含數據頁。 相反,葉節點包含索引行。
(8)sql索引日期擴展閱讀
聚集索引對於那些經常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。
例如,如果應用程序執行的一個查詢經常檢索某一日期范圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。
頻繁更改的列 這將導致整行移動,因為 SQL Server 必須按物理順序保留行中的數據值。這一點要特別注意,因為在大數據量事務處理系統中數據是易失的。來自聚集索引的鍵值由所有非聚集索引作為查找鍵使用,因此存儲在每個非聚集索引的葉條目內。