索引
1. 思考
在圖書館中是如何找到一本書的?
一般的應用系統對比資料庫的讀寫比例在10:1左右(即有10次查詢操作時有1次寫的操作),
而且插入操作和更新操作很少出現效能問題,
遇到最多、最容易出問題還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重
2. 解決辦法
當資料庫中資料量很大時,查詢資料會變得很慢
優化方案:索引
3. 索引是什麼
索引是一種特殊的檔案(innodb資料表上的索引是表空間的乙個組成部分),它們包含著對資料表裡所有記錄的引用指標。
更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度
4. 索引目的
索引的目的在於提高查詢效率,可以模擬字典,如果要查「mysql」這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要把所有單詞看一遍才能找到你想要的,如果我想找到m開頭的單詞呢?或者ze開頭的單詞呢?是不是覺得如果沒有索引,這個事情根本無法完成?
5. 索引原理
除了詞典,生活中隨處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查詢方式來鎖定資料。
資料庫也是一樣,但顯然要複雜許多,因為不僅面臨著等值查詢,還有範圍查詢(>、
6. 索引的使用
檢視索引
show index from 表名;
建立索引
如果指定欄位是字串,需要指定長度,建議長度與定義欄位時的長度一致
字段型別如果不是字串,可以不填寫長度部分
create index 索引名稱 on 表名(欄位名稱(長度))
刪除索引:
drop index 索引名稱 on 表名;
7. 索引demo
7.1. 建立測試表testindex
create table test_index(title varchar(10));
7.2 使用python程式(ipython也可以)通過pymsql模組 向表中加入十萬條資料
1 from pymysql importconnect2
3 defmain():4 #建立connection連線
5 conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')6 #獲得cursor物件
7 cursor =conn.cursor()8 #插入10萬次資料
9 for i in range(100000):10 cursor.execute("insert into test_index values('ha-%d')" %i)11 #提交資料
12 conn.commit()13
14 if __name__ == "__main__":15 main()
7.3. 查詢
開啟執行時間監測:
set profiling=1;
查詢第1萬條資料ha-99999
select * from test_index where title='ha-99999';
show profiles;
為表title_index的title列建立索引:
create index title_index on test_index(title(10));
執行查詢語句:
select * from test_index where title='ha-99999';
再次檢視執行的時間
show profiles;
執行截圖:
1.將1萬條資料插入到test_index表中
2.開啟執行時間監測
3.輸入查詢語句,並輸出查詢時間
4.建立索引
5.建立索引後,輸入查詢語句,輸出查詢時間
比較:query_id 3 和 7
8. 注意:
要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引檔案。
對於乙個經常需要更新和插入的**,就沒有必要為乙個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
建立索引會占用磁碟空間.
6 mysql索引 6 MySQL索引種類
1 普通索引 這是最基本的索引,它沒有任何限制,比如上文中為title欄位建立的索引就是乙個普通索引,myiasm中預設的btree型別的索引,也是我們大多數情況下用到的索引。直接建立索引 create index index name on table name column length 修改表...
6 mysql索引 Mysql索引詳解
索引 儲存引擎用於快速找到記錄的一種資料結構。索引型別 索引有很多種型別,如 b tree索引 雜湊索引 空間資料索引r tree 全文索引 主鍵索引等,在mysql 中,索引是在儲存引擎層而不是伺服器層實現的。所以沒有統一的索引標準 不同儲存引擎的索引工作方式並 不一樣,也不是所有儲存引擎都支援所...
C 問題6 Mysql索引分類
mysql索引包括普通索引 唯一索引 全文索引 單列索引 多列索引 空間索引 即不應用任何限制條件的索引,該索引可以在任何資料型別中建立。字段本身的約束條件可以判斷其值是否為空或唯一。使用unique引數可以設定唯一索引。建立該索引時,索引的值必須唯一。主鍵是一種特殊唯一索引。使用fulltext引...