數據庫索引
1.索引介紹
索引在MySQL中也叫做鍵,它是一個特殊的文件,它保存着數據表裏所有記錄的位置信息。通俗的來說,索引好比一本書的目錄,能加快數據庫的查詢速度。
應用場景:
當數據庫的數據量很大時,查找數據就會變得很慢,我們就可以通過索引來提高查詢數據庫的速度
2.索引使用
說明 | 命令 |
---|---|
查看索引 | show index from 表名; |
創建索引 | alter table 表名 add index 索引名[可選](列名, …); |
刪除索引 | alter table 表名 drop index 索引名 |
注意:
- 在表中,主鍵列會自動創建索引
- 創建索引時,索引名不指定,使用默認字段名
3.案例
創建測試表:
create table test_index(title varchar(10));
向表中插入十萬條數據:
from pymysql import connect
def main():
# 創建Connection連接
conn = connect(host='localhost',port=3306,database='python',user='root',password='mysql',charset='utf8')
# 獲得Cursor對象
cursor = conn.cursor()
# 插入10萬次數據
for i in range(100000):
cursor.execute("insert into test_index values('ha-%d')" % i)
# 提交數據
conn.commit()
if __name__ == "__main__":
main()
驗證索引性能操作:
-- 開啓運行時間監測:
set profiling=1;
-- 查找第1萬條數據ha-99999
select * from test_index where title='ha-99999';
-- 查看執行的時間:
show profiles;
-- 給title字段創建索引:
alter table test_index add index (title);
-- 再次執行查詢語句
select * from test_index where title='ha-99999';
-- 再次查看執行的時間
show profiles;
4.聯合索引
聯合索引又叫複合索引,即一個索引覆蓋表中兩個或者多個字段,一般用在多個字段一起查詢的時候
-- 創建teacher表
create table teacher
(
id int not null primary key auto_increment,
name varchar(10),
age int
);
-- 創建聯合索引
alter table teacher add index (name,age);
好處:
減少磁盤空間開銷,因爲每創建一個索引,其實就是創建了一個索引文件,那麼會增加磁盤空間的開銷
5.最左原則
在使用聯合索引的時候,我們要遵守一個最左原則,即index(name,age)支持 name 以及name 和 age 組合查詢,而不支持單獨 age 查詢,因爲沒有用到創建的聯合索引
示例:
-- 正確查詢示範
select * from stu where name='張三' -- 這裏使用了聯合索引的name部分
select * from stu where name='李四' and age=10 -- 這裏完整的使用聯合索引,包括 name 和 age 部分
-- 錯誤查詢示範
select * from stu where age=10 -- 聯合索引裏面沒有這個組合,只有 name | name age 這兩種組合
說明:
在使用聯合索引的查詢數據時候一定要保證聯合索引的最左側字段出現在查詢條件裏面,否則聯合索引失效
6,索引的優缺點和使用原則
(1)優點:
- 加快數據的查詢速度
(2)缺點:
- 創建索引會消耗時間和佔用磁盤空間,並且隨着數據量的增加所消耗的時間也會增加
(3)索引使用原則:
- 合理使用索引。通過優缺點對比,不是索引越多越好,而是需要自己合理的使用
- 查詢多的字段應創建索引。對經常用於查詢的字段應該創建索引
- 常更新的表少創建索引。對經常更新的表就避免對其進行過多索引的創建
- 數據量小的表不要創建索引。因爲由於數據較少,可能查詢全部數據花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果
- 相同值多的表不要創建索引。在一字段上相同值比較多不要建立索引,比如在學生表的"性別"字段上只有男,女兩個不同值。相反的,在一個字段上不同值較多可是建立索引