mysql 建索引_mysql数据库正确建立索引及使用
普通mysql運行,數據量和訪問量不大的話,是足夠快的,但是當數據量和訪問量劇增的時候,那么就會明顯發現MySQL很慢,甚至down掉,那么就要考慮優化我們的mysql了。其中優化mysql的一個重要環節就是為數據庫建立正確合理的索引。如果沒有索引,執行查詢時mysql必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表里面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,mysql無需掃描任何記錄即可迅速得到目標記錄所在的位置。也就是說索引可以大大減少數據庫管理系統查找數據的時間。索引有哪些優點?1、??通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。2、??可以大大加快數據的檢索速度,這也是創建索引的最主要原因。3、??可以加速表和表之間的連接,這在實現數據的參考完整性方面特別有意義。4、??在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。索引有哪些缺點?1、??創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。2、??除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,需要的空間就會更大。3、??當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。建立和使用索引有哪些注意事項:1、索引要建立在經常進行select操作的字段上。這是因為,如果這些列很少用到,那么有無索引并不能明顯改變查詢速度。相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求。2、?索引要建立在值比較唯一的字段上。這樣做才是發揮索引的最大效果。,比如主鍵的id字段,唯一的名字name字段等等。如果索引建立在唯一值比較少的字段,比如性別gender字段,寥寥無幾的類別字段等,剛索引幾乎沒有任何意義。3、?對于那些定義為text、p_w_picpath和bit數據類型的列不應該增加索引。因為這些列的數據量要么相當大,要么取值很少。4、?當修改性能遠遠大于檢索性能時,不應該創建索引。修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大于檢索性能時,不應該創建索引。5、?在WHERE和JOIN中出現的列需要建立索引。6、?在以通配符%和_開頭作查詢時,mysql索引是無效的。但是這樣索引是有效的:select?*?from?tbl1?where?name?like?'xxx%',所以mysql正確建立索引是很重要的。
假如你有一個表,
SQL> CREATE TABLE test_tab (
2 id INT,
3 name VARCHAR(10),
4 age INT,
5 val VARCHAR(10)
6 );
你的業務,有一個查詢,是
SELECT * FROM test_tab WHERE name = 一個外部輸入的數據
剛開始,數據不多的時候,執行效果還不錯。
隨著數據量的增加,這個查詢,執行起來,越來越慢了。
然后在 name 上面 建立了索引
CREATE INDEX idx_test4_name ON test_tab (name );
這樣, 可以加快前面那個查詢的速度。
但是,某天,你執行了下面這個SQL, 發現速度又慢了
SELECT * FROM test_tab WHERE age = 25
為啥呢? 因為 age 字段上面,沒有索引
索引只在 name 上面有
換句話說, 也就是 WHERE 里面的條件, 會自動判斷,有沒有 可用的索引,如果有, 該不該用。
多列索引,就是一個索引,包含了2個字段。
例如:
CREATE INDEX idx_test_name_age ON test_tab (name, age);
那么
SELECT * FROM test_tab
WHERE
name LIKE '張%'
AND age = 25
這樣的查詢,將能夠使用上面的索引。
多列索引,還有一個可用的情況就是, 某些情況下,可能查詢,只訪問索引就足夠了, 不需要再訪問表了。例如:
SELECT
AVG( avg ) AS 平均年齡
FROM
test_tab
WHERE
name LIKE '張%'
這個時候, name 與 age 都包含在索引里面。 查詢不需要去檢索表中的數據。
總結
以上是生活随笔為你收集整理的mysql 建索引_mysql数据库正确建立索引及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone6什么时候上市
- 下一篇: mysql iops_MySQL实例IO