MySQL View 視圖分析

為什么MySQL中很少使用視圖功能?

首先MySQL使用視圖有什么好處:

  • 清晰簡單,可以讓簡單的語句邏輯更清晰
  • 可復用,可以讓部分復雜的sql邏輯多次復用希痴,統(tǒng)一更新
  • 安全,可以隱藏掉一些私密的表結構

那么MySQL中的視圖性能如何呢春感?結合以下的MySQL官方文檔看一下視圖的主要算法:

The optional ALGORITHM clause for CREATE VIEW or ALTER VIEW is a MySQL extension to standard SQL. It affects how MySQL processes the view. ALGORITHM takes three values: MERGE, TEMPTABLE, or UNDEFINED.

For MERGE, the text of a statement that refers to the view and the view definition are merged such that parts of the view definition replace corresponding parts of the statement.

For TEMPTABLE, the results from the view are retrieved into a temporary table, which then is used to execute the statement.

For UNDEFINED, MySQL chooses which algorithm to use. It prefers MERGE over TEMPTABLE if possible, because MERGE is usually more efficient and because a view cannot be updatable if a temporary table is used.

If no ALGORITHM clause is present, the default algorithm is determined by the value of the derived_merge flag of the optimizer_switch system variable. For additional discussion, see Section 8.2.2.3, “Optimizing Derived Tables, View References, and Common Table Expressions”.

那么可以看到砌创,主要有兩種方式:MERGE和TEMPTABLE

  1. MERGE

把視圖中的sql合并到查詢sql中,例如官方例子中:

CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;
SELECT * FROM v_merge;

以上sql等價于

select * from (SELECT c1, c2 FROM t WHERE c3 > 100);
  1. TEMPTABLE
    臨時表算法是先將視圖查出來的數據保存到一個臨時表中甥厦,查詢的時候查這個臨時表

執(zhí)行計劃分析

CREATE TABLE `user_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;


先試用MERGE方式:

create or replace ALGORITHM =MERGE view v as select * From user_info;

執(zhí)行以下sql:

mysql> explain SELECT * FROM user_info where id =1;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | user_info | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> explain SELECT * FROM v where id =1;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | user_info | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

可以看到執(zhí)行計劃相同纺铭,并都使用了索引

再試用TEMPTABLE方式:

create or replace ALGORITHM =TEMPTABLE view v as select * From user_info;
mysql> explain SELECT * FROM user_info where id =1;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | user_info | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

mysql> explain SELECT * FROM v where id =1;
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table      | partitions | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra |
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
|  1 | PRIMARY     | <derived2> | NULL       | ref  | <auto_key0>   | <auto_key0> | 8       | const |    1 |   100.00 | NULL  |
|  2 | DERIVED     | user_info  | NULL       | ALL  | NULL          | NULL        | NULL    | NULL  |   10 |   100.00 | NULL  |
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

可以看到寇钉,查詢視圖的時候刀疙,首先使用的是查詢了全表放到臨時表中

總結

使用視圖時,如果使用TEMPTABLE會影響數據庫的優(yōu)化扫倡,比如索引等情況

使用視圖時谦秧,比較不容易看到視圖的邏輯,也不利于開發(fā)人員對sql的優(yōu)化

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末撵溃,一起剝皮案震驚了整個濱河市疚鲤,隨后出現的幾起案子,更是在濱河造成了極大的恐慌缘挑,老刑警劉巖集歇,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異语淘,居然都是意外死亡诲宇,警方通過查閱死者的電腦和手機际歼,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姑蓝,“玉大人鹅心,你說我怎么就攤上這事》挠” “怎么了旭愧?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宙暇。 經常有香客問我输枯,道長,這世上最難降的妖魔是什么占贫? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任用押,我火速辦了婚禮,結果婚禮上靶剑,老公的妹妹穿的比我還像新娘蜻拨。我一直安慰自己,他們只是感情好桩引,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布缎讼。 她就那樣靜靜地躺著,像睡著了一般坑匠。 火紅的嫁衣襯著肌膚如雪血崭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天厘灼,我揣著相機與錄音夹纫,去河邊找鬼。 笑死设凹,一個胖子當著我的面吹牛舰讹,可吹牛的內容都是我干的。 我是一名探鬼主播闪朱,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼月匣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奋姿?” 一聲冷哼從身側響起锄开,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎称诗,沒想到半個月后萍悴,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年癣诱,在試婚紗的時候發(fā)現自己被綠了任岸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狡刘,死狀恐怖享潜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嗅蔬,我是刑警寧澤剑按,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站澜术,受9級特大地震影響艺蝴,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鸟废,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一猜敢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒延,春花似錦缩擂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至计露,卻和暖如春博脑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背票罐。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工叉趣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人该押。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓疗杉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沈善。 傳聞我的和親對象是個殘疾皇子乡数,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容