mysql索引的建立和查詢語句優化

2022-02-17 09:10:42 字數 2163 閱讀 6618

# 300w條的模擬資料

# 並且沒有建立任何索引

以id查詢的(4秒多):

以email查詢的(4秒多):

建立後再查詢:

# 以id查不到1秒,所以索引要建立正確且查詢條件得適合

create index email_index on s1(email);

建立後查詢:

# 瞬間快了非常多

建立索引為了提高查詢的效率,建立正確索引,以及sql查詢語句正確,則可以提高使用者體驗。

primary key  # 唯一 + 非空 + 聚集索引

unique key   # 唯一 + 索引,輔助索引

index key    # 普通索引,能夠加速查詢,輔助索引

foreign key  # 本身沒有索引的,但是它關聯的外表中的字段是unique索引

注:(1) 主鍵作為條件的查詢如果能夠讓索引生效那麼效率總是更高

(2) primary key 和unique 標識的字段不需要再新增索引,直接就可以利用索引加速查詢

(3) 能用unique的時候盡量不用index,因為普通索引可以是建立再稍有重複的字段,但不可以重複過多的字段(大概重複10%以上不能建立普通索引了)

關於索引的建立和刪除:

# 最好在建表時候考慮好

新增主鍵:

alter table tablename add primary key(列名);

刪除主鍵:

alter table tablename drop primary key;

新增普通索引:

create index 索引名 on 表名(欄位名);

刪除普通索引:

drop index 索引名 on 表名;

新增unique:

alter table 表名 add unique (字段);

刪除unique:

alter table 表名 drop index欄位;

(1) 查詢條件字段一定是建立了索引的,如果查詢的條件字段沒有建立索引,那麼無效

(2) 查詢條件不能是乙個範圍條件,隨著範圍值的增大,索引發揮的作用越小

如:select * from s1 where id > 10000 and email='eva99999@oldboy';  # 這個語句不太好

(3) 使用like模糊查詢,使用abc%形式可以命中索引,但是%abc%不能命中索引

如:

(4) 索引列不要在條件中參與計算,也不要使用函式

(5) 多個索引條件以and相連時候,優先選擇區分度高的索引來進行查詢

如:select * from s1 where id=999 and username='zezhou';

# 可以看到該sql語句命中索引的情況

格式:explain sql語句;

沒建立索引:

建立了索引後:

檢視是否命中索引的例子:

mysql建立和刪除索引

摘自 longkm的部落格 建立和刪除索引 索引的建立可以在create table語句中進行,也可以單獨用create index或alter table來給表增加索引。刪除索引可以利用alter table或drop index語句來實現。1 使用alter table語句建立索引。語法如下 a...

mysql建立和刪除索引

2 索引作用 在索引列上,除了上面提到的有序查詢之外,資料庫利用各種各樣的快速定位技術,能夠大大提高查詢效率。特別是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快 成千上萬倍。例如,有3個未索引的表t1 t2 t3,分別只包含列c1 c2 c3,每個表分別含有1000行資料組成,指為...

mysql 索引的建立和刪除

mysqlinnodb 儲存引擎會為 primary key 和 unique 列自動建立 b 樹索引。這兩個列無須手動建立索引。create table test demo id int name varchar 10 age int address varchar 50 primary key ...