眾所周知,索引可以加快查詢的速度,但有的時候你的乙個小不注意索引就失效。 本博文結合例項追根究底研究索引。
前置條件:
為表達效果,請按本人部落格「mysql效能調優1」博文往supan表中插入7000萬資料。注意設定innodb_flush_log_at_trx_commit=2,否則插入7000萬資料,大概需要耗費你4個小時左右。
[color=darkblue]例項一:演示索引的告訴查詢[/color]
首選不建立supan表的grade欄位索引 進行grade欄位的查詢:
mysql> select * from supan where grade = 1515215;
+--------+---------+---------+
| name | id | grade |
+--------+---------+---------+
| 寮犱笁 | 4535219 | 1515215 |
+--------+---------+---------+
1 row in set ([color=blue]9.17 [/color]sec)
耗時:9.17秒
建立grade欄位上的索引:
mysql> create index index_supan_grade on supan(grade);
query ok, 0 rows affected (1 min 17.03 sec)
records: 0 duplicates: 0 warnings: 0
再次查詢
mysql> select * from supan where grade = 1515215;
+--------+---------+---------+
| name | id | grade |
+--------+---------+---------+
| 寮犱笁 | 4535219 | 1515215 |
+--------+---------+---------+
1 row in set (0.09 sec)
建立完索引後,用時僅為0.09秒 效率提公升到 9.17 / 0.09 倍
[color=darkblue]二:索引欄位上用表示式失效。[/color]
mysql> select * from supan where grade*10 = 256450;
+--------+---------+-------+
| name | id | grade |
+--------+---------+-------+
| 寮犱笁 | 1045649 | 25645 |
| 寮犱笁 | 2045649 | 25645 |
| 寮犱笁 | 3045649 | 25645 |
+--------+---------+-------+
3 rows in set (9.11 sec)
耗時9.11,又回到了遠古時代,呵呵呵。上面的sql其實可以完全改為下面的高效率sql:
mysql> select * from supan where grade = 256450;
+--------+---------+--------+
| name | id | grade |
+--------+---------+--------+
| 寮犱笁 | 1276454 | 256450 |
| 寮犱笁 | 2276454 | 256450 |
| 寮犱笁 | 3276454 | 256450 |
+--------+---------+--------+
3 rows in set (0.11 sec)
功能完全相同,但效率就是天上地下了,其中緣故你懂得。
[color=darkblue]三:mysql的索引欄位上用聚湊函式,索引不失效。oracle失效(值得注意)[/color]
mysql> select max(grade) from supan;
+------------+
| max(grade) |
+------------+
| 5792149 |
+------------+
1 row in set (0.00 sec)
[color=darkblue]四:索引對插入的影響[/color]
有索引的時候插入記錄
mysql> insert into supan(name,grade) values('chenchaoyang',100);
query ok, 1 row affected (0.09 sec)
刪除索引
mysql> drop index index_supan_grade on supan;
query ok, 0 rows affected (0.55 sec)
records: 0 duplicates: 0 warnings: 0
再次插入資料
mysql> insert into supan(name,grade) values('chenchaoyang',100);
query ok, 1 row affected (0.04 sec)
可以從兩次插入的耗時分析,在索引的時候插入資料,效率比較低下,所以在經常需要插入,更新的表中,盡量少使用索引。
MySql效能調優 索引
在對mysql的查詢語句優化過程中,我們最常用的手段就是新增索引,可見索引對資料庫優化的重要性,下面就說一說在優化過程中,索引的一些用法,鑑於本人水平有限,可能會有一些說得不對的地方,歡迎指正。下面例子中需要使用1張表,表結構如下 create table order order id int 11...
mysql效能調優
1.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應盡量避免在where子句中對字段進行null判斷,否則會導致引擎放棄使用索引而進行全表掃瞄。3.應盡量避免在where子句中使用 或 操作符,否則會導致引擎放棄使用索引而進行全表掃瞄。4...
Mysql效能調優
mysql 效能調優有很多方面,主要是這幾個方面 1 正規化 是指表的列具有原子性,不可再拆分,只要資料庫是線性的,都自動滿足1nf。2 正規化 表中的紀錄是唯一的。3 正規化 表中資料不應該有冗餘,如果通過某個欄位就能得到跟該字段相關的資訊,就沒必要將這些資訊,再存放到該表中。在3nf中,可能會對...