Mysql搜尋引擎及索引的選擇
Mysql搜尋引擎及索引的選擇
Mysql作為目前主流的開源關係型資料庫,它的搜尋引擎及索引的選擇是十分關鍵的,選擇正確能為資料庫帶來倍數的效率提升,而且這些效率提升是資源限制無關的,簡單說就是免費的
搜尋引擎
- 分為MyISAM和Innodb兩種
1. MyISAM(My Index Sequential Access Mode)索引循序存取法,MyISAM可壓縮,讀取效率高,所以經常把MyISAM用於slave層,或無寫操作的表,供客戶端去讀取,而myisam在寫庫操作的時候會產生排他鎖(表鎖),即隔離級別為最高級別。不支援事物,也不支援傳播特性。
2. Innodb讀取效率沒有MyISAM高,但它支援事物,隔離級別可設定。支援行鎖,對更新操作更靈活。所以通常我們見到的表都是Innodb,即使在有從庫的公司中,從庫的索引甚至還是Innodb。
- 使用
1. 建表
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=401 DEFAULT CHARSET=latin1;
2. 新增資料,筆者添加了400條資料
INSERT INTO test (NAME)
VALUES
(
'namenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename'
)
3. 檢視儲存方式及磁碟佔用
myisam資料檔案儲存格式及大小
innodb資料檔案儲存格式及大小
當然,也可以手動壓縮,在mysql bin目錄下執行
myisampack E:\5-mysqls\mysql_1\mysql-5.6.26-winx64\data\test\test.MYI
從57K壓縮到了16K
索引
-
索引型別
-
Normal
這是最基本的索引,它沒有任何限制
-
Unique
與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)
-
Full Text
MySQL從3.23.23版開始支援全文索引和全文檢索,FULLTEXT索引僅可用於 MyISAM 表;他們可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被建立,或是隨後使用ALTER TABLE 或CREATE INDEX被新增。
-
單列索引、多列索引
多個單列索引與單個多列索引的查詢效果不同,因為執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最為嚴格的索引。
-
組合索引
平時用的SQL查詢語句一般都有比較多的限制條件,所以為了進一步榨取MySQL的效率,就要考慮建立組合索引。組合索引遵循最左字首規則,簡單的理解就是隻從最左面的開始組合,並不是只要包含這兩列的查詢都會用到該組合索引。比如:
Index(field1, field2, field3)select*from table where field2 = 1; 不會使用以上索引 select*from table where field1 = 1; 會使用以上索引 select*from table where field2 = 1 and field1 = 1; 會使用以上索引 select*from table where field2 = 1 and field3 = 1; 不會使用以上索引
-
-
索引演算法
-
hash
散列表,會把欄位轉為<K(hash值) , V>。只支援等值查詢,不支援範圍查詢、排序等查詢,很明顯,hash的用處在關係型資料庫中是較少見的
-
B-tree
B+樹,支援範圍查詢、排序等關係型庫中常見的查詢功能,也是很常見的索引選擇
-
-
索引的建立
- 建表時
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)
2. 新增索引
ALTER TABLE table_name ADD ( INDEX | UNIQUE | FULLTEXT ) index_name ON (column(length));
-
索引的注意事項
-
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。建立索引會佔用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在一個大表上建立了多種組合索引,索引檔案的會膨脹很快。索引只是提高效率的一個因素,如果你的MySQL有大資料量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句。
-
索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在資料庫設計時不要讓欄位的預設值為NULL。
-
索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;儘量不要包含多個列的排序,如果需要最好給這些列建立複合索引。
-
like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。
-