幾乎所有的索引都是建立在字段之上.
索引: 系統根據某種算法, 將已有的數據(未來可能新增的數據),單獨建立一個文件: 文件能夠實現快速的匹配數據, 並且能夠快速的找到對應表中的記錄.
索引的意義
-
提升查詢數據的效率
-
約束數據的有效性(唯一性等)
增加索引的前提條件: 索引本身會產生索引文件(有時候有可能比數據文件還大) ,會非常耗費磁盤空間.
如果某個字段需要作爲查詢的條件經常使用, 那麼可以使用索引(一定會想辦法增加);
如果某個字段需要進行數據的有效性約束, 也可能使用索引(主鍵,唯一鍵)
Mysql中提供了多種索引
-
主鍵索引: primary key
-
唯一索引: unique key
-
全文索引: fulltext index
-
普通索引: index
- 外鍵索引: foreign key
全文索引: 針對文章內部的關鍵字進行索引
全文索引最大的問題: 在於如何確定關鍵字
英文很容易: 英文單詞與單詞之間有空格
中文很難: 沒有空格, 而且中文可以各種隨意組合(分詞: sphinx)
什麼情況下有索引,但用不上
-
條件中有or,即使其中有部分條件帶索引也不會使用(這也是爲什麼儘量少用or的原因),要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。
-
對於多列索引,第一個索引沒有使用,則不會使用索引。例如索引是key index (a,b,c). 可以是a | a,b| a,b,c 3種組合進行查找,但使用b,c不會使用索引。
-
like查詢是以%或 _開頭不會使用,% 或 _可以放在後面。
-
存在索引列的數據類型隱形轉換,則用不上索引,比如列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引。
-
where 子句裏對索引列上有數學運算,用不上索引。
-
where 子句裏對有索引列使用函數,用不上索引。
-
如果mysql估計使用全表掃描要比使用索引快,則不使用索引。