什麼是索引
索引是一種特殊的檔案,它們包含著對資料表裡所有記錄的引用指標。更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。濫用卻會適得其反。
利弊提高查詢速度;
降低更新表的速度,如對表進行insert、update和delete。因為更新表時,不僅要儲存資料,還要儲存一下索引檔案。
建立索引會占用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在乙個大表上建立了多種組合索引,索引檔案的會增長很快。
建立與刪除
建表語句一起建立索引
create
table table_name[col_name data
type][
unique
|fulltext]
[index
|key
][index_name]
(col_name[length])[
asc|
desc
]
unique|fulltext為可選引數,分別表示唯一索引、全文索引
index和key為同義詞,兩者作用相同,用來指定建立索引
index_name指定索引的名稱,為可選引數,如果不指定,預設col_name為索引值
col_name為需要建立索引的字段列,該列必須從資料表中該定義的多個列中選擇
length為可選引數,表示索引的長度,只有字串型別的字段才能指定索引長度
asc或desc指定公升序或降序的索引值儲存
索引型別
普通索引
最基本的索引,它沒有任何限制。
// 建立1
create
index index_name on
table
(column
(length)
)// 建立2
alter
table table_name add
index index_name on
(column
(length)
)// 刪除
drop
index index_name on
table
唯一索引
索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
// 建立1
create
unique
index indexname on
table
(column
(length)
)// 建立2
alter
table table_name add
unique indexname on
(column
(length)
)// 刪除
drop
index index_name on
table
主鍵索引
是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。一般是在建表的時候同時建立主鍵索引
create
table
`table_name`
(`id`
int(11)
notnull
auto_increment
,`title`
char
(255
)not
null
,primary
key(
`id`))
;
組合索引
指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。使用組合索引時遵循最左字首集合
alter
table
`table
`add
index name_city_age (name,city,age)
;
全文索引
主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。fulltext索引跟其它索引大不相同,它更像是乙個搜尋引擎,而不是簡單的where語句的引數匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引。
// 建立1
create
table
`table`(
`id`
int(11)
notnull
auto_increment
,`title`
char
(255
)character
notnull
,`content`
text
character
null,`
time
`int(10
)null
default
null
,primary
key(
`id`),
fulltext (content));
// 建立2
alter
table article add fulltext index_content(content)
// 建立3
create fulltext index index_content on article(content)
使用技巧
索引不會包含有null值的列
只要列中包含有null值都將不會被包含在索引中,復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓字段的預設值為null。
使用短索引
對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。
索引列排序
查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。
like語句操作
一般情況下不推薦使用like操作,如果非使用不可,如何使用也是乙個問題。like 「%aaa%」 不會使用索引而like 「aaa%」可以使用索引。
不使用not in和<>操作
不要在列上進行運算
這將導致索引失效而進行全表掃瞄,例如
select
*from table_name where
year
(column_name)
<
2017
;
mysql 整理索引 Mysql索引整理
1 mysql基本單位是頁,大小為16kb 16384 1024 頁是為了增加查詢效率,減少io的互動 區域性性原理 2 頁與頁之間是雙向鍊錶,插入的時候會根據主鍵id進行排序 單葉資料結構.jpg 3 在頁上有乙個頁目錄,相當於把資料進行分組,存放的是當前組最小的主鍵id,指標並且指向對應的資料 ...
mysql 索引 磁碟整理 mysql 索引整理
1 只對 where 和 order by 子句中需要的列新增索引,多餘的索引智慧型導致不必要的硬碟空間愛你消耗。每次修改表資訊時會更新索引,因此有索引的表效能會相應降低。2 對於要使用索引的列要使用屬性 not null 這樣就永遠不會儲存 null 值。3 最好用唯一化索引,一般情況下,當查詢優...
mysql 整理 索引
一 在 command line client 中進行複製 在命令視窗ctrl c是不起作用的,只能靠右擊彈出的選單中的功能。可以這樣做 右擊 選擇 標記 然後用滑鼠拖動要複製的內容,然後在合適的位置右擊 選擇 複製 索引 一 索引的原理 對要查詢的字段建立索引其實就是把該字段按照一定的方式排序 建...