1.什么索引
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表里所有記錄的位置信息。更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度.
2.索引工作原理
除了詞典,生活中隨處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得數據的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查找方式來鎖定數據。
數據庫也是一樣,但顯然要復雜許多,因為不僅面臨着等值查詢,還有范圍查詢(>、<、between、in)、模糊查詢(like)、並集查詢(or)等等。數據庫應該選擇怎么樣的方式來應對所有的問題呢?我們回想字典的例子,能不能把數據分成段,然后分段查詢呢?最簡單的如果1000條數據,1到100分成第一段,101到200分成第二段,201到300分成第三段……這樣查第250條數據,只要找第三段就可以了,一下子去除了90%的無效數據。
3.查看一個表中是否已經創建索引
show index from 表名;
4.創建索引(如果指定字段是字符串,需要指定長度,建議長度與定義字段時的長度一致,字段類型如果不是字符串,可以不填寫長度部分)
create index 索引名 on 數據表(字段名稱長度)
5.刪除索引
drop index 索引名稱 on 數據表
6.測試數據表是否能加快查詢速度
6.1創建一個數據表
create table my_index(title varchar(10));
6.2 插入數據
from pymysql import connect
def main():
# 創建Connection連接
conn = connect(host='localhost',port=3306,database='python_test_1',user='root',password='xu666666',charset='utf8')
# 獲得Cursor對象
cursor = conn.cursor()
# 插入10萬次數據
for i in range(100000):
cursor.execute("insert into my_index values('ha-%d')" % i)
# 提交數據
conn.commit()
if __name__ == "__main__":
main()
6.3 開始查詢並啟動時間檢測
- 開啟運行時間監測:
set profiling=1;
- 查找第1萬條數據ha-99999
select * from my_index where title='ha-99999';
- 查看執行的時間:
show profiles;
- 為表title_index的title列創建索引:
create index test_index on my_index(title(10));
- 執行查詢語句:
select * from my_index where title='ha-99999';
- 再次查看執行的時間
show profiles;
6.4 測試結果

注意
1.索引可以明顯提高某些字段的查詢效率,但不能加快插入,更新,刪除數據的效率,相反由於每次數據表數據的更改都會讓索引重新排列,會降低效率
2.要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。建立索引會占用磁盤空間。
3. 建立索引要創建在常用的查詢字段上,並且根據自己的需求建立說因數量

