日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mongo 唯一约束索引_Java:MySQL 基础知识+索引相关

發布時間:2025/3/12 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongo 唯一约束索引_Java:MySQL 基础知识+索引相关 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀本文前,請您先點擊上面的藍色字體,再點擊“關注”,這樣您就可以繼續免費收到最新文章了。每天都有分享。完全是免費訂閱,請放心關注。注:本文轉載自網絡,不代表本平臺立場,僅供讀者參考,著作權屬歸原創者所有。我們分享此文出于傳播更多資訊之目的。如有侵權,請在后臺留言聯系我們進行刪除,謝謝!

1.0基礎知識

一張數據表中具有百萬級的數據時,如何精確且快速的拿出其中某一條或多條記錄成為了人們思考的問題。

   InnoDB存儲引擎的出現讓這個問題得到了很好的解決,InnoDB存儲引擎是以索引來進行數據的組織,而索引在MySQL中也被稱之為鍵,因此UNIQUE KEY,PRIMARY KEY約束字段會作為索引字段。

   當沒有明確指出PRIMAY KEY時,InnoDB存儲引擎會自動的創建一個6字節的隱藏主鍵用于組織數據,但是由于該主鍵是隱藏的所以對查詢沒有任何幫助。

   索引相當于一本大字典的目錄,有了目錄來找想要的內容就快很多,否則就只能進行一頁一頁的遍歷查詢

2.0查找過程

   索引的查找過程是依照B+樹算法進行查找的,而每一張數據表都會有一個且只能有一個與之對應的樹

   只有最下面一層節點中存儲一整行記錄

   第二層及第一層中黃色部分為指針

   如圖所示,如果要查找數據項29,那么首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針,內存時間因為非常短(相比磁盤的IO)可以忽略不計,通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,通過指針加載磁盤塊8到內存,發生第三次IO,同時內存中做二分查找找到29,結束查詢,總計三次IO。真實的情況是,3層的B+樹可以表示上百萬的數據,如果上百萬的數據查找只需要三次IO,性能提高將是巨大的,如果沒有索引,每個數據項都要發生一次IO,那么總共需要百萬次的IO,顯然成本非常非常高。

3.0索引分類

   索引分為聚集索引與輔助索引

3.1聚集索引

   聚集索引是會直接按照B+樹進行查詢,由于B+樹的底層葉子節點是一整行記錄,所以聚集索引能夠十分快速的拿到一整行記錄。

   值得注意的是,一張數據表中只能有一個聚集索引。

3.2輔助索引

   輔助索引的樹最底層的葉子節點并不會存儲一整行記錄,而是只存儲單列索引的數據,并且還存儲了聚集索引的信息。

   通過輔助索引進行查詢時,先拿到自身索引字段的數據,再通過聚集索引拿到整行記錄,也就是說輔助索引拿一整行記錄而言需要最少兩次查詢。

   而一張數據表中可以有多個輔助索引。

4.0創建索引

4.1索引類型

索引名類型INDEX(field)普通索引,只加速查找,無約束條件PRIMARY KEY(field)主鍵索引,加速查找,非空且唯一約束UNIQUE(field)唯一索引,加速查找,唯一約束INDEX(field1,field2)聯合普通索引PRIMARY KEY(field1,field2)聯合主鍵索引UNIQUE(field1,field2)聯合唯一索引FULLTEXT(field)全文索引SPATIAL(field)空間索引

使用場景

4.2語法介紹

   索引應當再建立表時就進行創建,如果表中已有大量數據,再進行創建索引會花費大量的時間。

-- 方法一:創建表時
  CREATE TABLE 表名 (
字段名1 數據類型 [完整性約束條件…],
字段名2 數據類型 [完整性約束條件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [索引名] (字段名[(長度)] [ASC |DESC]) );-- 方法二:CREATE在已存在的表上創建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(長度)] [ASC |DESC]) ;
-- 方法三:ALTER TABLE在已存在的表上創建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(長度)] [ASC |DESC]) ; -- 刪除索引:DROP INDEX 索引名 ON 表名字;

4.3功能測試

-- 準備表,注意此時表沒有設置任何類型的索引
create table s1(
id int,
number varchar(20)
);
-- 創建存儲過程,實現批量插入記錄delimiter $$ -- 聲明存儲過程的結束符號為$$ create procedure auto_insert1()
BEGIN
declare i int default 1; -- 聲明定義變量
while(i < 1000000) do
insert into s1 values
(i,concat('第', i, '條記錄'));
set i = i + 1;
end while;
END $$ -- 存儲過程創建完畢delimiter ;-- 調用存儲過程,自動插入一百萬條數據call auto_insert1();

   在無索引的情況下,查找id為567891的這條記錄,耗時0.03s

mysql> select * from s1 where id = 567891;
+--------+--------------------+| id | number |+--------+--------------------+| 567891 | 第567891條記錄 |
+--------+--------------------+1 row in set (0.33 sec)

   接下來為id字段建立主鍵索引后再進行查找,耗時為0.00s

mysql> ALTER TABLE s1 MODIFY id int PRIMARY KEY;
Query OK, 0 rows affected (4.76 sec) -- 創建索引花費寺廟
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from s1 where id = 567891;
+--------+--------------------+| id | number |+--------+--------------------+| 567891 | 第567891條記錄 |
+--------+--------------------+1 row in set (0.00 sec) 再次查找則快了很多

總結

以上是生活随笔為你收集整理的mongo 唯一约束索引_Java:MySQL 基础知识+索引相关的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。