mysql索引及优化
1.mysql索引
MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會占用磁盤空間的索引文件。
2.索引類型
普通索引,唯一索引,主鍵索引,全文索引。
無論任何類型,都是通過建立關鍵字與位置的對應關系來實現的。
以上類型的差異:對索引關鍵字的要求不同。
添加修改索引語法:ALTER TABLE tbl_name ADD INDEX index_name (column_list(length)): 添加普通索引,索引值可出現多次。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。 ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用于全文索引。刪除索引語法: ALTER TABLE tbl_name drop INDEX 索引名;查看索引 SHOW INDEX FROM tbl_name3.普通索引(index)
這是最基本的索引,它沒有任何限制,比如上文中為title字段創建的索引就是一個普通索引,MyIASM中默認的BTREE類型的索引,也是我們大多數情況下用到的索引。
–修改表結構的方式添加索引 ALTER TABLE tbl_name ADD INDEX index_name (column_list(length))例: CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, INDEX index_name (name(length)) ); ALTER TABLE mytable ADD INDEX index_name ON (name(length))4.唯一索引(unique index)
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:
–修改表結構的方式添加索引 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)例: CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, UNIQUE unique_name (name(length)) ); ALTER TABLE mytable ADD UNIQUE index_name ON (name(length))5.主鍵索引(primary key)
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引:
--添加修改索引 ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );當然也可以用 ALTER 命令。記住:一個表只能有一個主鍵。
6.全文索引(fulltext key)
MySQL從3.23.23版開始支持全文索引和全文檢索;
--修改表結構的方式添加索引 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) --創建表全文索引 CREATE TABLE mytable( ID INT NOT NULL, name VARCHAR(16) NOT NULL, content TEXT PRIMARY KEY(ID),FULLTEXT(content) ); ALTER TABLE mytable ADD FULLTEXT index_content(content)使用全文索引常見的錯誤:
select * from mytable where content like "%mysql%";這里并不會使用全文索引,可以用explain進行查看。正確用法:
select?*?from?mytable?where?match(title,content) against ('MYSQL');備注:
- 在mysql中fulltext 索引只針對 myisam生效
- mysql自己提供的fulltext針對英文生效->sphinx(coreseek)技術處理中文
- 使用方法是 match(字段名..) against(‘關鍵字’)
7.組合索引(非mysql索引類型)
平時用的SQL查詢語句一般都有比較多的限制條件,所以為了進一步榨取MySQL的效率,就要考慮建立組合索引。
例如上表中針對title和time建立一個組合索引:ALTER TABLE mytable ADD INDEX index_name_content (name(50),content(10))。建立這樣的組合索引,其實是相當于分別建立了下面兩組組合索引:
- name,content
- name
為什么沒有content這樣的組合索引呢?這是因為MySQL組合索引“最左前綴”的結果。簡單的理解就是只從最左面的開始組合。并不是只要包含這兩列的查詢都會用到該組合索引,如下面的幾個SQL所示:
–使用到上面的索引SELECT * FROM mytable WHREE name='測試' AND content='123345'; SELECT * FROM mytable WHREE name='測試';–不使用上面的索引 SELECT * FROM mytable WHREE content='123345';8.執行計劃
可以使用explain語句去查看分析結果,而不是真正執行該語句。
其中,
- select_type
- table:表名
- type
- possible_keys:查詢可能使用到的索引都會在這里列出來。
- key:查詢真正使用到的索引,select_type為index_merge時,這里可能出現兩個以上的索引,其他的select_type這里只會出現一個。
- key_len:
用于處理查詢的索引長度,如果是單列索引,那就整個索引長度算進去,如果是多列索引,那么查詢不一定都能使用到所有的列,具體使用到了多少個列的索引,這里就會計算進去,沒有使用到的列,這里不會計算進去。
- ref:如果是使用的常數等值查詢,這里會顯示const,如果是連接查詢,被驅動表的執行計劃這里會顯示驅動表的關聯字段,如果是條件使用了表達式或者函數,或者條件列發生了內部隱式轉換,這里可能顯示為func。
- rows:這里是執行計劃中估算的掃描行數,不是精確值。
- extra:這個列可以顯示的信息非常多,有幾十種,常用的有:
9.MySQL索引的優化
比如我們對title,content 添加了復合索引
select * from table_name where title = 'test';會用到索引
select * from table_name where content = 'test';不會用到索引
- 12 小時前發布
總結
以上是生活随笔為你收集整理的mysql索引及优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis分页插件pageHelpe
- 下一篇: mysql中模糊查询的四种用法