# mysql索引
## 索引類型
### 普通索引
create index index_name on table_name(field_name);
### 唯一索引
unique index
### 主鍵
auto_increment primary key(id)
### 組合索引(為什么field2或者field2,field3字段上沒有索引。這是由于BTree索引因要遵守最左前綴原則)
create index index_name on table_name(field1,field2,field3);
B+樹是按照從左到右的順序來建立搜索樹的。如('張三',18,'18668247652')來檢索數據的時候,B+樹會優先匹配name來確定搜索方向,name匹配成功再依次匹配age、phoneNum,最后檢索到最終的數據。
like 'aaa%'//會用到索引
id與name都建立單列索引
order by name desc 不會使用索引
(id,name)建立聯合索引
最后需要注意mysql對排序記錄的大小有限制:max_length_for_sort_data 默認為1024;也就意味著如果需要排序的數據量大于1024,則order by不會使用索引,而是使用using filesort
6、如何用好索引
(1)依據where查詢條件建立索引;
(2)使用聯合索引,而不是多個單列索引;
例如:select * from tab_a where b=? and c=?這個SQL,對b c字段建立聯合索引的效率比單列的索引效率更高。
(3)聯合索引中索引的順序根據區分度排,區分度大的放在前面。區分度是指字段值的種類,字段值種類越多的字段要放在前面,例如:idx_smp(name,gender)的效率要比idx_smp(gender,name)的效率高
(4)聯合索引能為前綴單列、復列查詢提供幫助;
例如:
有idx_smp(a,b,c)這樣的索引,where a=?或者where a=? and b=?都可以使用該索引,但是where c=?就無法使用該索引。
(5)同樣的,要合理創建聯合索引,避免冗余
例如建立了idx_smp(a,b,c)就不需要建立idx_smp(a)、idx_smp(a,b)索引了。
(6)order by group by distinct等需要排序的操作,在沒有索引的大數據量情況下需要排序,對IO和CPU性能消耗很大。如果有類似排序需求,則需要對相關字段建立索引,這樣利用索引的有序特性不需要排序,直接按著索引順序掃描即可。
(7)select …where .. like ‘%xx’;這種%放在頭部的,是無法走索引的。
(8)select * 不建議使用,因為會讀取大量數據,也不利于使用索引覆蓋技術。索引字段能夠完全在索引中獲取, 就不要使用select *(因為會導致回表),無法完整在索引中獲取,也是建議select具體字段。
mysql對于排序,使用了兩個變量來控制sort_buffer_size和 max_length_for_sort_data
show processlist
- 前言
- Interview
- 01-cookie與session
- 04-mysql索引
- 05-memcache與redis
- 06-高并發
- 07-主從同步
- 08-myisam與inondb
- 09-框架區別
- 10-php7新特性
- 11-設計模式
- 12-MySQL優化
- 13-php自動加載機制
- 14-MongoDB命令
- 15-Python爬蟲之scrapy框架
- 16-php運行原理
- 17-單點登錄
- Linux
- linux常見命令
- awk
- sed
- bash-shell
- vim學習教程
- PHP
- php運行機制
- php執行效率
- word2pdf
- php預覽Word
- wechat_wafter2
- Python
- python
- win-bat
- svn操作命令
- git常用操作命令
- git_install
- gitlab安裝
- nextcloud
- docker