⑴ sql server索引怎麼用
1、打開 SQL Server Management Studio並連接到資料庫引擎資料庫。
2、在「對象資源管理器」窗格中展開「資料庫」節點。再打開「資料庫」節點下的「表」節點,再展開dbo.格式的表。
3、右擊「索引」選項,在彈出的快捷菜單中選擇「新建索引」命令。
4、在打開的「新建索引」對話框中,設置索引的名稱,索引類型為「聚集」, 然後單擊「添加」按鈕。
5、在打開的 「從dbo.表 中選擇列」 對話框中選擇要添加到索引鍵的表列。 然後點擊「確定」按鈕。
6、選擇索引鍵後的「新建索引」對話框中,設置索引列的排序為「升序/降序」,設置完成後,單擊「新建索引」對話框的「確定」按鈕,這樣就為表創建了索引。
⑵ MYSQL如何降序排列或如何加快降序查詢的速度
MySQL索引通常是被用於提高WHERE條件的數據行匹配或者執行聯結操作時匹配其它表的數據行的搜索速度。
MySQL也能利用索引來快速地執行ORDER BY和GROUP BY語句的排序和分組操作。
通過索引優化來實現MySQL的ORDER BY語句優化:
1、ORDER BY的索引優化。如果一個SQL語句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];
在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。
2、WHERE + ORDER BY的索引優化,形如:
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];
建立一個聯合索引(columnX,sort)來實現order by 優化。
注意:如果columnX對應多個值,如下面語句就無法利用索引來實現order by的優化
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];
3、WHERE+ 多個欄位ORDER BY
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;
建立索引(uid,x,y)實現order by的優化,比建立(x,y,uid)索引效果要好得多。
MySQL Order By不能使用索引來優化排序的情況
* 對不同的索引鍵做 ORDER BY :(key1,key2分別建立索引)
SELECT * FROM t1 ORDER BY key1, key2;
* 在非連續的索引鍵部分上做 ORDER BY:(key_part1,key_part2建立聯合索引;key2建立索引)
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;
* 同時使用了 ASC 和 DESC:(key_part1,key_part2建立聯合索引)
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
* 用於搜索記錄的索引鍵和做 ORDER BY 的不是同一個:(key1,key2分別建立索引)
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
* 如果在WHERE和ORDER BY的欄位上應用表達式(函數)時,則無法利用索引來實現order by的優化
SELECT * FROM t1 ORDER BY YEAR(logindate) LIMIT 0,10;
特別提示:
1>mysql一次查詢只能使用一個索引。如果要對多個欄位使用索引,建立復合索引。
2>在ORDER BY操作中,MySQL只有在排序條件不是一個查詢條件表達式的情況下才使用索引。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ryb7899/archive/2010/05/11/5580624.aspx
⑶ sql語句中怎麼修改 索引
我覺得應該不能修改索引吧。。創建索引的目的是為了提高查詢效率,是對於某個具體屬性而建立的,如果用戶覺得這個索引不適合,或者說這個索引創建的不好,那麼可以刪除索引,重新再創建一個索引。某個屬性創建索引不適合,可以把該索引刪掉,再在另外的屬性上創建一個索引,因此應該就沒有必要再設計一個可以創建索引的方法或語句。刪除後再創建一個索引可以達到這樣的效果。
要不你把題目仔細說一下。。有試過搭配用desc來達到降序的目的嗎
⑷ 使用MySQL的遞延Join連接實現高效分頁 - Aaron
在 Web 應用程序中跨大型數據集分頁記錄似乎是一個簡單的問題,但實際上很難擴展。兩種主要的分頁策略是偏移/限制和游標。
我們將首先看一下這兩種方法,然後稍作修改,可以使偏移/限制非常高效。
偏移/限制分頁
偏移/限制方法是迄今為止最常見的方法,它通過跳過一定數量的記錄(頁)並將結果限制為一頁來工作。
例如,假設您的應用程序配置為每頁顯示 15 條記錄。您的 SQL 將如下所示:
這是最常見的,因為它非常簡單,易於推理,並且幾乎每個框架都支持它。
除了易於實現之外,它還具有頁面可直接定址的優點。例如,如果您想直接導航到第 20 頁,您可以這樣做,因為該偏移量很容易計算。
但是有一個主要的缺點,它潛伏在資料庫處理偏移量尺雀的方式中。偏移量告訴資料庫放棄從查詢中返回的前N個結果。不過資料庫仍然要從磁碟上獲取這些行。
如果你丟棄的是100條記錄,這並不重要,但如果你丟棄的是100,000條記錄,資料庫就會為了丟棄這些結果而做大量的工作。
在實踐中,這意味著第一個頁面會快速載入,之後的每一個頁面都會變得越來越慢,直到你達到一個點,網路請求可能會直接超時。
基於游標的分頁
基於游標的分頁彌補了偏移/限制的一些不足,同時引入了一些自己的不足。
基於游標的分頁是通過存儲一些關於最後呈現給用戶態滾的記錄的狀態,然後根據這個狀態來進行下一次查詢。
因此,它不是按順序獲取所有的記錄並丟棄前N條,而是只獲取最後一個位置N之後的記錄。
如果按ID排序,SQL可能看起來像這樣。
你可能已經看到了其中的好處。因為我們知道上次向用戶展示的ID,我們知道下一個頁面將以一個更高的ID開始。我們甚至不需要檢查ID較低的行,因為我們百分之百肯定地知道那些行不需要被顯示。
在上面的例子中,我特別說明了ID可能不帆困余是連續的,也就是說,可能有缺失的記錄。這使得我們無法計算出哪些記錄會出現在某一頁面上,你必須跟蹤之前那一頁面上的最後一條記錄是什麼。
與偏移/限制分頁不同,使用游標分頁時,頁面不能直接定址,你只能導航到 "下一頁 "或 "上一頁"。
不過游標分頁的好處是在任何數量的頁面上都很迅速。它也很適合無限滾動,在這種情況下,頁面首先不需要可以直接定址。
Laravel文檔中有一些關於偏移量和游標之間的權衡的好的背景。
https://laravel.com/docs/pagination cursor -vs-offset-pagination
考慮到所有這些,讓我們來看看一個偏移/限制優化,可以使它的性能足以在成千上萬的頁面上使用。
使用遞延join的Offset/Limit
遞延連接(deferred join )是一種技術,它將對要求的列的訪問推遲到應用了偏移量和限制之後。
使用這種技術,我們創建一個內部查詢,可以用特定的索引進行優化,以獲得最大的速度,然後將結果連接到同一個表,以獲取完整的行。
它看起來像這樣:
這種方法的好處可以根據你的數據集有很大的不同,但是這種方法允許資料庫盡可能少地檢查數據,以滿足用戶的意圖。
查詢中 "昂貴的 "select *部分只在與內部查詢相匹配的15條記錄上運行。所有數據的Select都被推遲了,因此被稱為推遲join。
這種方法不太可能比傳統的偏移/限制性能差,盡管它是可能的,所以一定要在你的數據上進行測試!
Laravel實現
我們如何把這一點帶到我們最喜歡的網路框架,如Laravel和Rails?
讓我們具體看看Laravel,因為我不知道Rails。
感謝Laravel的macroable特性,我們可以擴展Eloquent Query Builder來添加一個新的方法,叫做deferredPaginate。為了保持一致性,我們將模仿常規分頁的簽名。
我們將嘗試做盡可能少的自定義工作,並將大部分工作留給 Laravel。
這是我們要做的:
這應該為我們提供 LaravelLengthAwarePaginator 和延遲連接的所有好處!
一個Github倉庫
遞延Join和覆蓋索引
還沒有完成...
使用遞延Join的主要好處是減少了資料庫必須檢索然後丟棄的數據量。我們可以通過幫助資料庫獲得它需要的數據而更進一步,而無需獲取底層行。
這樣做的方法稱為「覆蓋索引covering index」,它是確保快速偏移/限制分頁的最終解決方案。
覆蓋索引是一個索引,在這個索引中,查詢的所有需要的欄位都包含在索引本身中。當一個查詢的所有部分都能被一個索引 "覆蓋 "時,資料庫根本不需要讀取該行,它可以從索引中獲得它需要的一切。
請注意,覆蓋索引並不是以任何特殊方式創建的。它只是指一個索引滿足了一個查詢所需要的一切的情況。一個查詢上的覆蓋索引很可能不是另一個查詢上的覆蓋索引。
在接下來的幾個例子中,我們將使用這個基本的表,我把它填滿了~1000萬條記錄。
讓我們看一個僅select索引列的簡單查詢。在這種情況下,我們將從email表中進行select contacts。
在這種情況下,資料庫根本不需要讀取基礎行。在MySQL中,我們可以通過運行一個解釋並查看額外的列來驗證這一點:
extra: using index告訴我們,MySQL能夠只使用索引來滿足整個查詢,而不看基礎行。
如果嘗試select name from contacts limit 10, 我們將期望MySQL必須到該行去獲取數據,因為名字name沒有被索引。這正是發生的情況,由下面的解釋顯示。
extra不再顯示 using index,所以我們沒有使用覆蓋索引。
假設你每頁有15條記錄,你的用戶想查看第1001頁,你的內部查詢最終會是這樣的。
select id from contacts order by id limit 15 OFFSET 150000
explain結果顯示:
MySQL能夠單看索引來執行這個查詢。它不會簡單地跳過前15萬行,在使用offset是沒有辦法的,但它不需要讀取15萬行。(只有游標分頁可以讓你跳過所有的行)。
即使使用覆蓋索引和延遲連接,當你到達後面的頁面時,結果也會變慢,盡管與傳統的偏移/限制相比,它應該是最小的。使用這些方法,你可以輕易地深入到數千頁。
更好的覆蓋索引
這里的很多好處取決於擁有良好的覆蓋索引,所以讓我們稍微討論一下。一切都取決於您的數據和用戶的使用模式,但是您可以採取一些措施來確保查詢的最高命中率。
這將主要與 MySQL 對話,因為那是我有經驗的地方。其他資料庫中的情況可能會有所不同。
大多數開發人員習慣於為單列添加索引,但沒有什麼能阻止您向多列添加索引。事實上,如果您的目標是為昂貴的分頁查詢創建覆蓋索引,您幾乎肯定需要一個多列索引。
當你試圖為分頁優化一個索引時,一定要把按列排序放在最後。如果你的用戶要按update_at排序,這應該是你復合索引中的最後一列。
看看下面這個包括三列的索引。
在MySQL中,復合索引是從左到右訪問的,如果一個列缺失,或者在第一個范圍條件之後,MySQL會停止使用一個索引。
MySQL 將能夠在以下場景中使用該索引:
如果你跳過is_archived,MySQL將無法訪問update_at,將不得不訴諸於沒有該索引的排序,或者根本不使用該索引,所以要確保你有相應的計劃。
主鍵始終存在
在MySQL的InnoDB中,所有的索引都附加了主鍵。這意味著(email)的索引實際上是(email,id)的索引,當涉及到覆蓋索引和延遲連接時,這是相當重要的。
查詢select email from contacts order by id完全被email上的一個索引所覆蓋,因為InnoDB將id附加到了該索引上。
使用我們上面的綜合例子,你可以看到這有什麼好處。
因為復合索引涵蓋了is_deleted, is_archived, updated_at, 和(通過InnoDB的功能)id,整個查詢可以僅由索引來滿足。
降序索引
大多數時候,用戶都在尋找 "最新的 "項目,即最近更新或創建的項目,這可以通過按update_at DESC排序來滿足。
如果你知道你的用戶主要是以降序的方式對他們的結果進行排序,那麼特別將你的索引設為降序索引可能是有意義的。
MySQL 8是第一個支持降序索引的MySQL版本。
如果你在explain的Extra部分看到向後索引掃描,你也許可以配置一個更好的索引。
前向索引掃描比後向掃描快~15%,所以你要按照你認為你的用戶最常使用的順序添加索引,並為少數使用情況承擔懲罰。
太陽底下無新事
這種使用偏移/限制分頁與延遲連接和覆蓋索引的方法並不是銀彈。
僅僅是遞遲連接就可以讓你的速度得到很好的提升,但是需要花一些額外的心思來設計正確的索引以獲得最大的好處。
有一種觀點認為,遞延連接應該是框架中默認的偏移offset/限制limit方法,而任何時候覆蓋索引的出現都只是一種獎勵。我還沒有在足夠多的生產環境中測試過,所以還沒有強烈主張這樣做。
使用MySQL的遞延Join連接實現高效分頁 - Aaron
⑸ Sql server如何為表A的B欄位創降序索引
CREATE INDEX IND_A_B_DESC ON A(B DESC);
⑹ sql建立降序索引,該怎麼解決
如果需要降序排序,使用order by desc,這是默認的,不需要設置也是降序,一般情況下按主鍵
⑺ sql如何建立降序索引 和刪除索引
建立降序索引語法:
createindex索引名on表名(欄位名desc);
註:desc換成asc則是升序索引。
刪除索引語法:
dropindex索引名;
(7)sql8降序索引擴展閱讀:
索引的使用及注意事項御嘩
盡量避免這些不走索引的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 不猜局走索引
參考資料:網路索引
⑻ sql資料庫降序排列問題
SELECT TOP 10 FROM 表名 ORDER BY 排序列 DESC;
SQL的執行順序先按照你的要求排序,然後才返回查詢的內容。例如有一個名為ID自動增長的列,表中有100條數據,列的值得分別是1、2、3、4………9、99、100。那麼查詢加了DESC你得到的是91到100條,就是最後十條,如果加ASC你得到的將會是1到10,也就是最前面的那幾條。
⑼ sql查詢降序和升序的問題
select * from news where typeid="000501" order by 需要排序的欄位名 這里後面不寫默認是升序
降序的話select * from news where typeid="000501" order by 需要排序的欄位名 desc