MySQL 索引
MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度,
打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是一個人力三輪車,
拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查找到需要的字,
索引分單列索引和組合索引,
單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引,
組合索引,即一個索引包含多個列,
創建索引時,你需要確保該索引是應用在 SQL 查詢陳述句的條件(一般作為 WHERE 子句的條件),
實際上,索引也是一張表,該表保存了主鍵與索引欄位,并指向物體表的記錄,
上面都在說使用索引的好處,但過多的使用索引將會造成濫用,因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE,因為更新表時,MySQL不僅要保存資料,還要保存一下索引檔案,
建立索引會占用磁盤空間的索引檔案,占用資源 第二個弊端
普通索引
最基本的索引型別,沒有唯一性之類的限制,
創建索引
這是最基本的索引,它沒有任何限制,它有以下幾種創建方式:
CREATE INDEX indexName ON table_name (column_name)
如果是CHAR,VARCHAR型別,length可以小于欄位實際長度;如果是BLOB和TEXT型別,必須指定 length,
修改表結構(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
創建表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
洗掉索引的語法
DROP INDEX [indexName] ON mytable;
唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引,
當現有資料中存在重復的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存,資料庫還可能防止添加將在表中創建重復鍵值的新資料,例如,如果在 employee 表中職員的姓 (lname) 上創建了唯一索引,則任何兩個員工都不能同姓,
創建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
創建表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
使用ALTER 命令添加和洗掉索引
有四種方式來添加資料表的索引:
-
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
該陳述句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL,
-
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條陳述句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次),
-
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次,
-
**ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)😗*該陳述句指定了索引為 FULLTEXT ,用于全文索引,
以下實體為在表中添加索引,
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你還可以在 ALTER 命令中使用 DROP 子句來洗掉索引,嘗試以下實體洗掉索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
使用 ALTER 命令添加和洗掉主鍵
主鍵作用于列上(可以一個列或多個列聯合主鍵),添加主鍵索引時,你需要確保該主鍵默認不為空(NOT NULL),實體如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令洗掉主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
洗掉主鍵時只需指定PRIMARY KEY,但在洗掉索引時,你必須知道索引名,
主鍵索引
簡稱為主索引,資料庫表中一列或列組合(欄位)的值唯一標識表中的每一行,該列稱為表的主鍵,
在資料庫關系圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定型別,該索引要求主鍵中的每個值都唯一,當在查詢中使用主鍵索引時,它還允許對資料的快速訪問,
提示盡管唯一索引有助于定位資訊,但為獲得最佳性能結果,建議改用主鍵索引,
候選索引
與主索引一樣要求欄位值的唯一性,并決定了處理記錄的順序,在資料庫和自由表中,可以為每個表建立多個候選索引,
聚集索引
也稱為聚簇索引,在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同,一個表只能包含一個聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 關鍵字,
索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配,與非聚集索引相比,聚集索引通常提供更快的資料訪問速度,聚集索引更適用于對很少對基表進行增刪改操作的情況,
如果在表中創建了主鍵約束,SQL Server將自動為其產生唯一性約束,在創建主鍵約束時,指定了CLUSTERED關鍵字或干脆沒有制定該關鍵字,SQL Sever將會自動為表生成唯一聚集索引,
優點
1.大大加快資料的檢索速度;
2.創建唯一性索引,保證資料庫表中每一行資料的唯一性;
3.加速表和表之間的連接;
4.在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間,
缺點
1.索引需要占物理空間,
2.當對表中的資料進行增加、洗掉和修改的時候,索引也要動態的維護,降低了資料的維護速度,
SELECT陳述句的關鍵字執行順序
1.FROM 確定查詢的表
2.WHERE 對資料按條件篩選
3.GROUP BY 對篩選后的資料分組
4.HAVING 對分組后的資料再次進行篩選
5.SELECT 生成結果集
6.ORDER BY 對結果集進行排序
什么是 ACID ?
-
原子性 Atomic 事務必須是原子作業單元 ( 不可分割 ) ;對于其資料修改,要么全都執行,要么全都不執行,
-
一致性 Consistent 操作前的資料,操作后的資料保持一致,
-
隔離性 Insulation 保證多用戶并發訪問的資料安全性,并發事務所作的修改必須與任何其它并發事務所作的修改隔離,
-
持久性 Duration 事務操作的資料 持久化到資料庫當中 , 對于系統的影響是永久性的,
專案中是如何進行具體的sql優化的?
(1)選擇最有效率的表名順序
(2)當只需要一行資料時候使用limit1;
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)通過內部函式提高SQL效率
(6)避免在索引列上使用計算,
(7)提高GROUP BY 陳述句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/274797.html
標籤:其他
上一篇:什么是Mybaits?
