1. 程式人生 > >Mysql搜尋引擎及索引的選擇

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

在這裡插入圖片描述

索引
  • 索引型別

    1. Normal

            這是最基本的索引,它沒有任何限制

    2. Unique

            與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)

    3. Full Text

            MySQL從3.23.23版開始支援全文索引和全文檢索,FULLTEXT索引僅可用於 MyISAM 表;他們可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被建立,或是隨後使用ALTER TABLE 或CREATE INDEX被新增。

    4. 單列索引、多列索引

            多個單列索引與單個多列索引的查詢效果不同,因為執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最為嚴格的索引。

    5. 組合索引

            平時用的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; 不會使用以上索引
      
  • 索引演算法

    1. hash

      散列表,會把欄位轉為<K(hash值) , V>。只支援等值查詢,不支援範圍查詢、排序等查詢,很明顯,hash的用處在關係型資料庫中是較少見的

    2. B-tree

      B+樹,支援範圍查詢、排序等關係型庫中常見的查詢功能,也是很常見的索引選擇

  • 索引的建立

    1. 建表時
     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%”可以使用索引。