MySQL 性能優(yōu)化神器 Explain

摘自 https://segmentfault.com/a/1190000008131735,這是目前在 google 搜得到的寫得最好的一篇,不過沒有列舉所有情況廉嚼,日后有更豐富的經(jīng)驗(yàn)再來補(bǔ)充防楷。

簡介

MySQL提供了一個(gè)EXPLAIN命令躁锡,它可以對(duì)SELECT語句進(jìn)行分析吆玖,并輸出SELECT執(zhí)行的詳細(xì)信息筒溃,以供開發(fā)人員針對(duì)性優(yōu)化。EXPLAIN命令用法十分簡單沾乘,在SELECT語句前加上Explain就可以了怜奖,例如:

EXPLAIN SELECT * from user_info WHERE id < 300;

準(zhǔn)備

為了接下來方便演示EXPLAIN的使用,首先我們需要建立兩個(gè)測(cè)試用的表翅阵,并添加相應(yīng)的數(shù)據(jù):

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`),
  KEY `name_index` (`name`)
)
  ENGINE = InnoDB
  DEFAULT CHARSET = utf8

INSERT INTO user_info (name, age) VALUES ('xys', 20);
INSERT INTO user_info (name, age) VALUES ('a', 21);
INSERT INTO user_info (name, age) VALUES ('b', 23);
INSERT INTO user_info (name, age) VALUES ('c', 50);
INSERT INTO user_info (name, age) VALUES ('d', 15);
INSERT INTO user_info (name, age) VALUES ('e', 20);
INSERT INTO user_info (name, age) VALUES ('f', 21);
INSERT INTO user_info (name, age) VALUES ('g', 23);
INSERT INTO user_info (name, age) VALUES ('h', 50);
INSERT INTO user_info (name, age) VALUES ('i', 15);
CREATE TABLE `order_info` (
  `id`           BIGINT(20)  NOT NULL AUTO_INCREMENT,
  `user_id`      BIGINT(20)           DEFAULT NULL,
  `product_name` VARCHAR(50) NOT NULL DEFAULT '',
  `productor`    VARCHAR(30)          DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)
)
  ENGINE = InnoDB
  DEFAULT CHARSET = utf8

INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p2', 'WL');
INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'DX');
INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p5', 'WL');
INSERT INTO order_info (user_id, product_name, productor) VALUES (3, 'p3', 'MA');
INSERT INTO order_info (user_id, product_name, productor) VALUES (4, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (6, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (9, 'p8', 'TE');

EXPLAIN 輸出格式

EXPLAIN命令的輸出內(nèi)容大致如下:

mysql> explain select * from user_info where id = 2
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

各列的含義如下:

  • id:SELECT 查詢的標(biāo)識(shí)符. 每個(gè) SELECT 都會(huì)自動(dòng)分配一個(gè)唯一的標(biāo)識(shí)符
  • select_type:SELECT 查詢的類型.
  • table:查詢的是哪個(gè)表
  • partitions:匹配的分區(qū)
  • type:join 類型
  • possible_keys:此次查詢中可能選用的索引
  • key:此次查詢中確切使用到的索引
  • ref:哪個(gè)字段或常數(shù)與 key 一起被使用
  • rows:顯示此查詢一共掃描了多少行烦周,這個(gè)是一個(gè)估計(jì)值
  • filtered:表示此查詢條件所過濾的數(shù)據(jù)的百分比
  • extra:額外的信息

接下來我們來重點(diǎn)看一下比較重要的幾個(gè)字段。

id

id是用來順序標(biāo)識(shí)整個(gè)查詢中SELELCT語句的怎顾,在嵌套查詢中id越大的語句越先執(zhí)行读慎。該值可能為NULL,如果這一行用來說明的是其他行的聯(lián)合結(jié)果槐雾。

select_type

select_type表示了查詢的類型, 它的常用取值有:

  • SIMPLE夭委,表示此查詢不包含 UNION 查詢或子查詢
  • PRIMARY,表示此查詢是最外層的查詢
  • UNION募强,表示此查詢是 UNION 的第二或隨后的查詢
  • DEPENDENT UNION株灸,UNION 中的第二個(gè)或后面的查詢語句,取決于外面的查詢
  • UNION RESULT擎值,UNION 的結(jié)果
  • SUBQUERY慌烧,子查詢中的第一個(gè) SELECT
  • DEPENDENT SUBQUERY:子查詢中的第一個(gè) SELECT,取決于外面的查詢鸠儿。即子查詢依賴于外層查詢的結(jié)果屹蚊。

最常見的查詢類別應(yīng)該是SIMPLE了,比如當(dāng)我們的查詢沒有子查詢进每,也沒有UNION查詢時(shí)汹粤,那么通常就是SIMPLE類型,例如:

mysql> explain select * from user_info where id = 2
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

如果我們使用了UNION查詢, 那么EXPLAIN輸出的結(jié)果類似如下:

mysql> EXPLAIN (SELECT * FROM user_info  WHERE id IN (1, 2, 3))
    -> UNION
    -> (SELECT * FROM user_info WHERE id IN (3, 4, 5));
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
| id | select_type  | table      | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra           |
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
|  1 | PRIMARY      | user_info  | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |    3 |   100.00 | Using where     |
|  2 | UNION        | user_info  | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |    3 |   100.00 | Using where     |
| NULL | UNION RESULT | <union1,2> | NULL       | ALL   | NULL          | NULL    | NULL    | NULL | NULL |     NULL | Using temporary |
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
3 rows in set, 1 warning (0.00 sec)

table

表示查詢涉及的表或衍生表

type

type字段比較重要田晚,它提供了判斷查詢是否高效的重要依據(jù)嘱兼。通過type字段,我們判斷此次查詢是全表掃描還是索引掃描等贤徒。

type 常用類型

type常用的取值有:

  • system:表中只有一條數(shù)據(jù)芹壕。這個(gè)類型是特殊的const類型。
  • const:針對(duì)主鍵或唯一索引的等值查詢掃描接奈,最多只返回一行數(shù)據(jù)踢涌。const查詢速度非常快鲫趁,因?yàn)樗鼉H僅讀取一次即可斯嚎。

例如下面的這個(gè)查詢利虫,它使用了主鍵索引挨厚,因此type就是const類型的堡僻。

mysql> explain select * from user_info where id = 2
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
  • eq_ref:此類型通常出現(xiàn)在多表的join查詢,表示對(duì)于前表的每一個(gè)結(jié)果疫剃,都只能匹配到后表的一行結(jié)果钉疫。并且查詢的比較操作通常是=,查詢效率較高巢价。

例如:

mysql> EXPLAIN SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: index
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 314
          ref: NULL
         rows: 9
     filtered: 100.00
        Extra: Using where; Using index
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: test.order_info.user_id
         rows: 1
     filtered: 100.00
        Extra: NULL
2 rows in set, 1 warning (0.00 sec)
  • ref:此類型通常出現(xiàn)在多表的join查詢牲阁,針對(duì)于非唯一或非主鍵索引,或者是使用了最左前綴規(guī)則索引的查詢壤躲。

例如下面這個(gè)例子中城菊,就使用到了ref類型的查詢:

mysql> EXPLAIN SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id AND order_info.user_id = 5
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: ref
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 9
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index
2 rows in set, 1 warning (0.01 sec)
  • range:表示使用索引范圍查詢,通過索引字段范圍獲取表中部分?jǐn)?shù)據(jù)記錄碉克。這個(gè)類型通常出現(xiàn)在=凌唬,<>>漏麦,>=客税,<<=撕贞,IS NULL更耻,<=>BETWEEN捏膨,IN() 操作中秧均。
    當(dāng)typerange時(shí),那么EXPLAIN輸出的ref字段為NULL号涯,并且key_len字段是此次查詢中使用到的索引的最長的那個(gè)熬北。

例如下面的例子就是一個(gè)范圍查詢:

mysql> EXPLAIN SELECT *
    ->         FROM user_info
    ->         WHERE id BETWEEN 2 AND 8
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: NULL
         rows: 7
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
  • index:表示全索引掃描(full index scan),和ALL類型類似诚隙,只不過ALL類型是全表掃描讶隐,而index類型則僅僅掃描所有的索引,而不掃描數(shù)據(jù)久又。
    index類型通常出現(xiàn)在:所要查詢的數(shù)據(jù)直接在索引樹中就可以獲取到巫延,而不需要掃描數(shù)據(jù)。當(dāng)是這種情況時(shí)地消,Extra字段會(huì)顯示Using index炉峰。

例如:

mysql> EXPLAIN SELECT name FROM  user_info 
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: index
possible_keys: NULL
          key: name_index
      key_len: 152
          ref: NULL
         rows: 10
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

上面的例子中,我們查詢的name字段恰好是一個(gè)索引脉执,因此我們直接從索引中獲取數(shù)據(jù)就可以滿足查詢的需求了疼阔,而不需要查詢表中的數(shù)據(jù)。因此這樣的情況下,type的值是index婆廊,并且Extra的值是Using index迅细。

ALL:表示全表掃描,這個(gè)類型的查詢是性能最差的查詢之一淘邻。通常來說茵典,我們的查詢不應(yīng)該出現(xiàn)ALL類型的查詢,因?yàn)檫@樣的查詢?cè)跀?shù)據(jù)量大的情況下宾舅,對(duì)數(shù)據(jù)庫的性能是巨大的災(zāi)難统阿。如一個(gè)查詢是ALL類型查詢,那么一般來說可以對(duì)相應(yīng)的字段添加索引來避免筹我。

下面是一個(gè)全表掃描的例子扶平,可以看到,在全表掃描時(shí)蔬蕊,possible_keyskey字段都是NULL蜻直,表示沒有使用到索引,并且rows十分巨大袁串,因此整個(gè)查詢效率是十分低下的概而。

mysql> EXPLAIN SELECT age FROM  user_info WHERE age = 20
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10
     filtered: 10.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

type類型的性能比較

通常來說,不同的type類型的性能關(guān)系如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system
ALL類型因?yàn)槭侨頀呙璐研蓿虼嗽谙嗤牟樵儣l件下赎瑰,它是速度最慢的。
index類型的查詢雖然不是全表掃描破镰,但是它掃描了所有的索引餐曼,因此比ALL類型的稍快。
后面的幾種類型都是利用了索引來查詢數(shù)據(jù)鲜漩,因此可以過濾部分或大部分?jǐn)?shù)據(jù)源譬,因此查詢效率就比較高了。

possible_keys

possible_keys表示 MySQL 在查詢時(shí)孕似,能夠使用到的索引踩娘。注意,即使有些索引在possible_keys中出現(xiàn)喉祭,但是并不表示此索引會(huì)真正地被 MySQL 使用到养渴。MySQL 在查詢時(shí)具體使用了哪些索引,由key字段決定泛烙。

key

此字段是 MySQL 在當(dāng)前查詢時(shí)所真正使用到的索引理卑。

key_len

表示查詢優(yōu)化器使用了索引的字節(jié)數(shù)。這個(gè)字段可以評(píng)估組合索引是否完全被使用蔽氨,或只有最左部分字段被使用到藐唠。
key_len的計(jì)算規(guī)則如下:

  • 字符串
    • char(n):n 字符長度
    • varchar(n):如果是utf8編碼帆疟,則是3n + 2字節(jié);如果是utf8mb4編碼宇立,則是4n + 2字節(jié)踪宠。
  • 數(shù)值類型:
    • TINYINT:1 字節(jié)
    • SMALLINT:2 字節(jié)
    • MEDIUMINT:3 字節(jié)
    • INT:4 字節(jié)
    • BIGINT:8 字節(jié)
  • 時(shí)間類型
    • DATE:3 字節(jié)
    • TIMESTAMP:4 字節(jié)
    • DATETIME:8 字節(jié)
  • 字段屬性:NULL屬性占用一個(gè)字節(jié)。如果一個(gè)字段是NOT NULL的泄伪,則沒有此屬性。

我們來舉兩個(gè)簡單的栗子:

mysql> EXPLAIN SELECT * FROM order_info WHERE user_id < 3 AND product_name = 'p1' AND productor = 'WHH' 
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: range
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 9
          ref: NULL
         rows: 5
     filtered: 11.11
        Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

上面的例子是從表order_info中查詢指定的內(nèi)容匿级,而我們從此表的建表語句中可以知道蟋滴,表order_info有一個(gè)聯(lián)合索引:

KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)

不過此查詢語句WHERE user_id < 3 AND product_name = 'p1' AND productor = 'WHH'中,因?yàn)橄冗M(jìn)行 user_id的范圍查詢痘绎,而根據(jù)最左前綴匹配原則津函,當(dāng)遇到范圍查詢時(shí),就停止索引的匹配孤页,因此實(shí)際上我們使用到的索引的字段只有user_id尔苦,因此在EXPLAIN中,顯示的key_len為 9行施。因?yàn)?code>user_id字段是 BIGINT允坚,占用 8 字節(jié),而NULL屬性占用一個(gè)字節(jié)蛾号,因此總共是 9 個(gè)字節(jié)稠项。若我們將user_id字段改為 BIGINT(20) NOT NULL DEFAULT '0',則key_length應(yīng)該是 8鲜结。

上面因?yàn)?strong>最左前綴匹配原則展运,我們的查詢僅僅使用到了聯(lián)合索引的user_id字段,因此效率不算高精刷。

接下來我們來看一下下一個(gè)例子:

mysql> EXPLAIN SELECT * FROM order_info WHERE user_id = 1 AND product_name = 'p1';
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: ref
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 161
          ref: const,const
         rows: 2
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

這次的查詢中拗胜,我們沒有使用到范圍查詢,key_len的值為 161怒允。為什么呢埂软?因?yàn)槲覀兊牟樵儣l件WHERE user_id = 1 AND product_name = 'p1'中,僅僅使用到了聯(lián)合索引中的前兩個(gè)字段纫事,因此keyLen(user_id) + keyLen(product_name) = 9 + 50 * 3 + 2 = 161仰美。

rows

rows也是一個(gè)重要的字段。MySQL 查詢優(yōu)化器根據(jù)統(tǒng)計(jì)信息儿礼,估算 SQL 要查找到結(jié)果集需要掃描讀取的數(shù)據(jù)行數(shù)咖杂。
這個(gè)值非常直觀顯示 SQL 的效率好壞,原則上rows越少越好蚊夫。

Extra

Explain中的很多額外的信息會(huì)在Extra字段顯示诉字,常見的有以下幾種內(nèi)容:

  • Using filesort
    當(dāng)Extra中有Using filesort時(shí),表示 MySQL 需額外的排序操作,不能通過索引順序達(dá)到排序效果壤圃。一般有Using filesort陵霉,都建議優(yōu)化去掉,因?yàn)檫@樣的查詢 CPU 資源消耗大伍绳。

例如下面的例子:

mysql> EXPLAIN SELECT * FROM order_info ORDER BY product_name
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: index
possible_keys: NULL
          key: user_product_detail_index
      key_len: 253
          ref: NULL
         rows: 9
     filtered: 100.00
        Extra: Using index; Using filesort
1 row in set, 1 warning (0.00 sec)

我們的索引是

KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)

但是上面的查詢中根據(jù)product_name來排序踊挠,因此不能使用索引進(jìn)行優(yōu)化,進(jìn)而會(huì)產(chǎn)生Using filesort冲杀。
如果我們將排序依據(jù)改為ORDER BY user_id, product_name效床,那么就不會(huì)出現(xiàn)Using filesort了。例如:

mysql> EXPLAIN SELECT * FROM order_info ORDER BY user_id, product_name
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: index
possible_keys: NULL
          key: user_product_detail_index
      key_len: 253
          ref: NULL
         rows: 9
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)
  • Using index
    “覆蓋索引掃描”权谁,表示查詢?cè)谒饕龢渲芯涂刹檎宜钄?shù)據(jù)剩檀,不用掃描表數(shù)據(jù)文件,往往說明性能不錯(cuò)旺芽。
  • Using temporary
    查詢有使用臨時(shí)表沪猴,一般出現(xiàn)于排序,分組和多表 join 的情況采章,查詢效率不高运嗜,建議優(yōu)化。

PS

現(xiàn)在的 MySQL 5.7 索引貌似不是根據(jù)最左前綴匹配原則悯舟。所以有時(shí)間會(huì)對(duì)本文做一定修改洗出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市图谷,隨后出現(xiàn)的幾起案子翩活,更是在濱河造成了極大的恐慌,老刑警劉巖便贵,帶你破解...
    沈念sama閱讀 211,496評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菠镇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡承璃,警方通過查閱死者的電腦和手機(jī)利耍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盔粹,“玉大人隘梨,你說我怎么就攤上這事∠衔耍” “怎么了轴猎?”我有些...
    開封第一講書人閱讀 157,091評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長进萄。 經(jīng)常有香客問我捻脖,道長锐峭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評(píng)論 1 283
  • 正文 為了忘掉前任可婶,我火速辦了婚禮沿癞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矛渴。我一直安慰自己椎扬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評(píng)論 6 385
  • 文/花漫 我一把揭開白布具温。 她就那樣靜靜地躺著蚕涤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桂躏。 梳的紋絲不亂的頭發(fā)上钻趋,一...
    開封第一講書人閱讀 49,802評(píng)論 1 290
  • 那天川陆,我揣著相機(jī)與錄音剂习,去河邊找鬼。 笑死较沪,一個(gè)胖子當(dāng)著我的面吹牛鳞绕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尸曼,決...
    沈念sama閱讀 38,945評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼们何,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了控轿?” 一聲冷哼從身側(cè)響起冤竹,我...
    開封第一講書人閱讀 37,709評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茬射,沒想到半個(gè)月后鹦蠕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡在抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評(píng)論 2 327
  • 正文 我和宋清朗相戀三年钟病,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刚梭。...
    茶點(diǎn)故事閱讀 38,637評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肠阱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朴读,到底是詐尸還是另有隱情屹徘,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評(píng)論 4 329
  • 正文 年R本政府宣布衅金,位于F島的核電站缘回,受9級(jí)特大地震影響吆视,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酥宴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評(píng)論 3 313
  • 文/蒙蒙 一啦吧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拙寡,春花似錦授滓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诚啃,卻和暖如春淮摔,著一層夾襖步出監(jiān)牢的瞬間掘而,已是汗流浹背烁设。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舟误,地道東北人造垛。 一個(gè)月前我還...
    沈念sama閱讀 46,344評(píng)論 2 360
  • 正文 我出身青樓魔招,卻偏偏與公主長得像,于是被迫代替她去往敵國和親五辽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子办斑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評(píng)論 2 348