MySQL:如何快速的查看Innodb數(shù)據(jù)文件


水平有限闲擦,有誤請(qǐng)諒解

注意:本文很多輸出格式是16進(jìn)制格式。
使用版本:MySQL 5.7.22

經(jīng)常有朋友問(wèn)我一些如何查看Innodb數(shù)據(jù)文件的問(wèn)題比如:

  • 如果我是UTF8字符集澈蚌,如果插入字符‘a(chǎn)’到底占用幾個(gè)字節(jié) ?
  • 主鍵和普通索引葉子節(jié)點(diǎn)的行數(shù)據(jù)在存儲(chǔ)上有哪些區(qū)別灼狰?
  • 如何證明rowid的存在宛瞄?
  • 數(shù)據(jù)中的NULL值如何存儲(chǔ)的?
  • char和varchar在存儲(chǔ)上的區(qū)別交胚?
    ......

如果要得到答案除了學(xué)習(xí)源碼份汗,可能更加直觀的方式就是查看Innodb的ibd數(shù)據(jù)文件了,俗話說(shuō)得好“眼見(jiàn)為實(shí)”蝴簇,但是我們知道數(shù)據(jù)文件是二進(jìn)制形式的杯活,Innodb通過(guò)既定的訪問(wèn)方式解析出其中的格式得到正確的結(jié)果。如果我們要去訪問(wèn)這些ibd文件熬词,通常的方式就是可以通過(guò)hexdump -Cv這樣的命令進(jìn)行二進(jìn)制的訪問(wèn)旁钧,最初我也是這樣訪問(wèn)的,但是看起來(lái)眼睛特別難受互拾。因此我寫(xiě)了2個(gè)工具:

  • innblock:一個(gè)用于解析數(shù)據(jù)塊的工具歪今,能夠得到每行的偏移量,并且按照邏輯和物理順序排序颜矿。詳細(xì)使用方式可以參考 https://mp.weixin.qq.com/s/yfi5XikDJlh6-nS-eoJbcA
    下載地址:https://github.com/gaopengcarl/innblock 除了代碼我已經(jīng)編譯好了直接使用即可

  • bcview:一個(gè)小工具彤委,用于將數(shù)據(jù)文件按照既定的大小(比如16K)分塊或衡,然后訪問(wèn)每個(gè)塊的偏移量后指定的字節(jié)數(shù)焦影,通常我們并不知道記錄到底多長(zhǎng),可以設(shè)置一個(gè)較大的查看字節(jié)數(shù)封断。
    下載地址:https://github.com/gaopengcarl/bcview 除了代碼我已經(jīng)編譯好了直接使用即可

有了這兩工具可能訪問(wèn)ibd數(shù)據(jù)文件就更加方便一些了斯辰,下面我就使用這兩個(gè)工具來(lái)進(jìn)行數(shù)據(jù)文件的查看,來(lái)解決開(kāi)頭我們提出的這些問(wèn)題坡疼。

一彬呻、行結(jié)構(gòu)簡(jiǎn)述

本文無(wú)意解釋詳細(xì)的Innodb文件結(jié)構(gòu),這樣的文章和書(shū)籍很多柄瑰,比如:

整個(gè)系列都是講解Innodb文件結(jié)構(gòu)的闸氮,我們只需要知道普通數(shù)據(jù)塊,除去塊級(jí)別的開(kāi)銷(xiāo)后教沾,其第一行記錄從偏移量94 開(kāi)始蒲跨,首先出現(xiàn)的是2個(gè)偽列 infimum 和 supremum,它們的位置固定在塊的94-120字節(jié)授翻,其中94-107為infimum 相關(guān)信息或悲,而107到120為supremum相關(guān)信息孙咪,分別的heap no 為 0和1,它們是邏輯記錄的開(kāi)始和結(jié)尾巡语,所有的實(shí)際的記錄都鏈接在這一條鏈表上翎蹈。

其中普通記錄的大概格式如下:

格式.jpg

我暫且將黃色部分稱為‘行頭’,圖中用粉紅色標(biāo)記的innblock每行數(shù)據(jù)offset的位置男公,我們發(fā)現(xiàn)innblock工具指向的是行頭以后實(shí)際字段開(kāi)啟的位置荤堪。

下面是一個(gè)innblock工具典型的部分輸出:

-----Total used rows:3 used rows list(logic):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) normal record offset:128 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0
(3) SUPREMUM record offset:112 heapno:1 n_owned 2,delflag:N minflag:0 rectype:3
-----Total used rows:3 used rows list(phy):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) SUPREMUM record offset:112 heapno:1 n_owned 2,delflag:N minflag:0 rectype:3
(3) normal record offset:128 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0

我們可以找到一行除了infimum和 supremum記錄以外的normal記錄,并且標(biāo)記了這樣記錄字段的起點(diǎn)(offset:128)枢赔,也就是圖中的粉紅色部分逞力,但是需要注意的是聚集索引(表本身)而言,如果沒(méi)有主鍵前面3列分別為:

  • rowid 6字節(jié)
  • trx id 6字節(jié)
  • roll ptr 7字節(jié)

如果存在主鍵則為:

  • 主鍵 和定義有關(guān)
  • trx id 6字節(jié)
  • roll ptr 7字節(jié)

關(guān)于rowid\trx id\roll ptr的源碼中的定義如下:

#define DATA_ROW_ID 0   /* row id: a 48-bit integer */
#define DATA_ROW_ID_LEN 6   /* stored length for row id */

#define DATA_TRX_ID 1   /* transaction id: 6 bytes */
#define DATA_TRX_ID_LEN 6

#define DATA_ROLL_PTR   2   /* rollback data pointer: 7 bytes */
#define DATA_ROLL_PTR_LEN 7

而roll ptr的具體含義可以參考函數(shù)trx_undo_decode_roll_ptr如下:

/***********************************************************************//**
Decodes a roll pointer. */ 
//從高位到低位依次是  
//第1位是否是insert 
//第2到8位是segmentid
//第9到40位為page no 
//第41位到56位為OFFSET
UNIV_INLINE
void
trx_undo_decode_roll_ptr(
/*=====================*/
    roll_ptr_t  roll_ptr,   /*!< in: roll pointer */
    ibool*      is_insert,  /*!< out: TRUE if insert undo log */
    ulint*      rseg_id,    /*!< out: rollback segment id */
    ulint*      page_no,    /*!< out: page number */
    ulint*      offset)     /*!< out: offset of the undo
                    entry within page */
{
...
    ut_ad(roll_ptr < (1ULL << 56));
    *offset = (ulint) roll_ptr & 0xFFFF; //獲取低16位 為OFFSET
    roll_ptr >>= 16; //右移16位
    *page_no = (ulint) roll_ptr & 0xFFFFFFFF;//獲取32位為 page no
    roll_ptr >>= 32;//右移32位
    *rseg_id = (ulint) roll_ptr & 0x7F;//獲取7位為segment id
    roll_ptr >>= 7;//右移7位
    *is_insert = (ibool) roll_ptr; /* TRUE==1 *///最后一位
}

二糠爬、建立測(cè)試表

為了解決文中開(kāi)頭的幾個(gè)問(wèn)題寇荧,我們來(lái)建立測(cè)試表如下:

drop table baguait1;
create table baguait1(id int primary key,c1 varchar(20) ,c2 varchar(20),c3 char(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table baguait1 add key(c1);

insert into baguait1 values(1,NULL,'gaopeng','gaopeng');
insert into baguait1 values(2,'gaopeng',NULL,'gaopeng');
insert into baguait1 values(3,'gaopeng',NULL,NULL);
insert into baguait1 values(4,'a',NULL,NULL);

mysql> select * from baguait1;
+----+---------+---------+---------+
| id | c1      | c2      | c3      |
+----+---------+---------+---------+
|  1 | NULL    | gaopeng | gaopeng |
|  2 | gaopeng | NULL    | gaopeng |
|  3 | gaopeng | NULL    | NULL    |
|  4 | a       | NULL    | NULL    |
+----+---------+---------+---------+
4 rows in set (0.01 sec)

我們發(fā)現(xiàn)這里實(shí)際上除了rowid問(wèn)題還不能包含,其他都包含了执隧,接下來(lái)我們使用innblock進(jìn)行掃描揩抡。如下:

1、掃描數(shù)據(jù)文件找到主鍵和普通索引數(shù)據(jù)塊

[root@gp1 test]# ./innblock baguait1.ibd scan 16
···
Datafile Total Size:114688
===INDEX_ID:323
level0 total block is (1)
block_no:         3,level:   0|*|
===INDEX_ID:324
level0 total block is (1)
block_no:         4,level:   0|*|

這里實(shí)際上323就是聚集索引镀琉,324就是普通索引峦嗤,它們數(shù)據(jù)塊對(duì)應(yīng)是3和4。

2屋摔、掃描聚集索引記錄

[root@gp1 test]# ./innblock baguait1.ibd 3 16

鏈表部分:
==== Block list info ====
-----Total used rows:6 used rows list(logic):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) normal record offset:128 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0
(3) normal record offset:180 heapno:3 n_owned 0,delflag:N minflag:0 rectype:0
(4) normal record offset:231 heapno:4 n_owned 0,delflag:N minflag:0 rectype:0
(5) normal record offset:262 heapno:5 n_owned 0,delflag:N minflag:0 rectype:0
(6) SUPREMUM record offset:112 heapno:1 n_owned 5,delflag:N minflag:0 rectype:3
-----Total used rows:6 used rows list(phy):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) SUPREMUM record offset:112 heapno:1 n_owned 5,delflag:N minflag:0 rectype:3
(3) normal record offset:128 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0
(4) normal record offset:180 heapno:3 n_owned 0,delflag:N minflag:0 rectype:0
(5) normal record offset:231 heapno:4 n_owned 0,delflag:N minflag:0 rectype:0
(6) normal record offset:262 heapno:5 n_owned 0,delflag:N minflag:0 rectype:0

3烁设、掃描普通索引記錄

[root@gp1 test]# ./innblock baguait1.ibd 4 16

鏈表部分:
==== Block list info ====
-----Total used rows:6 used rows list(logic):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) normal record offset:126 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0
(3) normal record offset:173 heapno:5 n_owned 0,delflag:N minflag:0 rectype:0
(4) normal record offset:137 heapno:3 n_owned 0,delflag:N minflag:0 rectype:0
(5) normal record offset:155 heapno:4 n_owned 0,delflag:N minflag:0 rectype:0
(6) SUPREMUM record offset:112 heapno:1 n_owned 5,delflag:N minflag:0 rectype:3
-----Total used rows:6 used rows list(phy):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) SUPREMUM record offset:112 heapno:1 n_owned 5,delflag:N minflag:0 rectype:3
(3) normal record offset:126 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0
(4) normal record offset:137 heapno:3 n_owned 0,delflag:N minflag:0 rectype:0
(5) normal record offset:155 heapno:4 n_owned 0,delflag:N minflag:0 rectype:0
(6) normal record offset:173 heapno:5 n_owned 0,delflag:N minflag:0 rectype:0

我們發(fā)現(xiàn)不管聚集索引還是普通索引均包含了4條普通記錄,并且采集到了記錄的偏移量钓试,我們需要注意一下這里普通索引的邏輯鏈表順序中我們可以看到第4條記錄(offset:173 )已經(jīng)排到了第3位装黑,實(shí)際上它是最后插入的,這是因?yàn)椤產(chǎn)’字符的順序肯定是在‘gaopeng’這個(gè)字符串之前的弓熏。并且第一行記錄C1為NULL它在邏輯鏈表順序中依然是在第一位恋谭。好了下面我們就來(lái)將問(wèn)題逐一解決。

三挽鞠、如果我是UTF8字符集疚颊,如果插入字符‘a(chǎn)’到底占用幾個(gè)字節(jié) ?

在我們的語(yǔ)句中我們最后一條記錄插入的數(shù)據(jù)就是'a'信认,即:

|  4 | a       | NULL    | NULL    |

我們使用bcview來(lái)查看一下聚集索引 (offset 262 )的數(shù)據(jù)是啥材义,我們直接從塊3的(offset 262 )后查看20個(gè)字節(jié),如下:

[root@gp1 test]# ./bcview baguait1.ibd 16 262 30|grep 00000003
current block:00000003--Offset:00262--cnt bytes:30--data is:8000000400000005d970e000000043011061000000000000000000000000

我們來(lái)解析一樣:

  • 80000004:主鍵4嫁赏,8是符號(hào)位
  • 400000005d970:trx id 6字節(jié)
  • e0000000430110:undo ptr 7字節(jié)
  • 61:字符‘a(chǎn)’其掂,ASCII編碼

我們發(fā)現(xiàn)后面都是0了,實(shí)際上字符‘a(chǎn)’即便在UTF8字符下也只是占用一個(gè)字節(jié)而已橄教。

四清寇、主鍵和普通索引葉子節(jié)點(diǎn)的行數(shù)據(jù)在存儲(chǔ)上有哪些區(qū)別?

下面我先總結(jié)一下:

  • 主鍵會(huì)包含全部的字段护蝶,普通索引只會(huì)包含它定義的字段內(nèi)容
  • 主鍵會(huì)包含trx id和roll ptr华烟,普通索引不會(huì)包含
  • 即便不定義主鍵也會(huì)包含一個(gè)根據(jù)rowid排列的聚集索引,很明顯如果不定義普通索引則不會(huì)存在
  • 普通索引葉子結(jié)點(diǎn)包含了主鍵或者rowid

下面我們驗(yàn)證一下持灰,我們來(lái)觀察第2行數(shù)據(jù)盔夜,即:

|  2 | gaopeng | NULL    | gaopeng |

在主鍵上這條記錄存在于(offset:180)中,在普通索引這條記錄存在于(offset:137)中堤魁,下面我們分別解析:

主鍵(block 3 offset 180 ):

[root@gp1 test]# ./bcview baguait1.ibd 16 180 50|grep 00000003
current block:00000003--Offset:00180--cnt bytes:50--data is:8000000200000005d96adc00000042011067616f70656e6767616f70656e6720202020202020202020202020070600002000

解析一下:

  • 80000002:主鍵
  • 00000005d96a:trx id 6字節(jié)
  • dc000000420110:undo ptr 7字節(jié)
  • 67616f70656e67:第二個(gè)字段的‘gaopeng’的ASCII編碼
  • 67616f70656e6720202020202020202020202020:第四個(gè)字段的‘gaopeng’的ASCII編碼喂链,并且因?yàn)槭莄har(20)類型因此出現(xiàn)了0X20補(bǔ)足的情況,這實(shí)際上也解決了第5個(gè)問(wèn)題妥泉,我們可以實(shí)實(shí)在在的看到這種補(bǔ)足操作椭微,占用了更多的空間。

這里我們發(fā)現(xiàn)這條記錄沒(méi)有第三個(gè)字段盲链,因?yàn)槠錇镹ULL蝇率,其包含在NULL位圖中,后面我們會(huì)說(shuō)明刽沾。

普通索引(block 4 offset 137 ):

[root@gp1 test]# ./bcview baguait1.ibd 16 137 20|grep 00000004
current block:00000004--Offset:00137--cnt bytes:20--data is:67616f70656e67800000020700000020ffd56761

解析如下:

  • 67616f70656e67:‘gaopeng’的ASCII編碼
  • 80000002:主鍵值2

后面的內(nèi)容是下一行的行頭了本慕,這一點(diǎn)如果不確定可以看看最后一行,最后一行的位置是(offset:173)查看如下:

[root@gp1 test]# ./bcview baguait1.ibd 16 173 20|grep 00000004
current block:00000004--Offset:00173--cnt bytes:20--data is:6180000004000000000000000000000000000000

解析為:

  • 61:‘a(chǎn)’的ASCII編碼
  • 80000004:主鍵值4

后面是0了侧漓,我們這里可以看到?jīng)]有trx id和roll ptr锅尘,除了鍵值以外普通索引還包含了主鍵。

五布蔗、char和varchar在存儲(chǔ)上的區(qū)別藤违?

這一點(diǎn)我在上面已經(jīng)說(shuō)了,下面我們還是以第二行數(shù)據(jù)為例:

|  2 | gaopeng | NULL    | gaopeng |

其中第1個(gè)‘gaopeng’是varchar(20)第2個(gè)‘gaopeng’是char(20)下面是他們的存儲(chǔ)方式:

  • 67616f70656e67:第二個(gè)字段的‘gaopeng’的ASCII編碼
  • 67616f70656e6720202020202020202020202020:第四個(gè)字段的‘gaopeng’的ASCII編碼纵揍,并且因?yàn)槭莄har(20)類型因此出現(xiàn)了0X20補(bǔ)足20字節(jié)的情況纺弊,我們可以實(shí)實(shí)在在的看到這種補(bǔ)足操作,占用了更多的空間骡男。

不再過(guò)多熬述

六淆游、數(shù)據(jù)中的NULL值如何存儲(chǔ)的?

這一點(diǎn)還記得‘行頭’的NULL位圖嗎隔盛?實(shí)際上這個(gè)位圖會(huì)為每一個(gè)可以為NULL的字段預(yù)留1位的空間犹菱,用于標(biāo)記是否字段的值為NULL,當(dāng)然至少1字節(jié)(8位)吮炕。

+----+---------+---------+---------+
| id | c1      | c2      | c3      |
+----+---------+---------+---------+
|  1 | NULL    | gaopeng | gaopeng |
|  2 | gaopeng | NULL    | gaopeng |
|  3 | gaopeng | NULL    | NULL    |
|  4 | a       | NULL    | NULL    |
+----+---------+---------+---------+

c1\c2\c3均可以為空腊脱,因此我們分別訪問(wèn)4條記錄聚集索引(block 3)上的NULL位圖信息,計(jì)算方式如下:

  • 第1行:記錄(offset:128)那么128-5(5字節(jié)固定)-1(1字節(jié)NULL位圖)= 122
  • 第2行:記錄(offset:180)那么180-5(5字節(jié)固定)-1(1字節(jié)NULL位圖)= 174
  • 第3行:記錄(offset:231)那么231-5(5字節(jié)固定)-1(1字節(jié)NULL位圖)= 225
  • 第4行:記錄(offset:262)那么262-5(5字節(jié)固定)-1(1字節(jié)NULL位圖)= 256

好了有了偏移量我們可以使用bcview訪問(wèn)這1字節(jié)的NULL位圖信息了如下:

第1行
[root@gp1 test]# ./bcview baguait1.ibd 16 122 1 |grep 00000003
current block:00000003--Offset:00122--cnt bytes:01--data is:01
轉(zhuǎn)換為二進(jìn)制為:0000 0001

第2行
[root@gp1 test]# ./bcview baguait1.ibd 16 174 1 |grep 00000003
current block:00000003--Offset:00174--cnt bytes:01--data is:02
轉(zhuǎn)換為二進(jìn)制為:0000 0010

第3行
[root@gp1 test]# ./bcview baguait1.ibd 16 225 1 |grep 00000003
current block:00000003--Offset:00225--cnt bytes:01--data is:06
轉(zhuǎn)換為二進(jìn)制為:0000 0110

第4行
[root@gp1 test]# ./bcview baguait1.ibd 16 256 1 |grep 00000003
current block:00000003--Offset:00256--cnt bytes:01--data is:06
轉(zhuǎn)換為二進(jìn)制為:0000 0110

下面就是NULL位圖的表示方法龙亲,1為NULL陕凹,我們發(fā)現(xiàn)和我們記錄中的NULL記錄一模一樣悍抑。

c3 c2 c1
第1行 0 0 1
第2行 0 1 0
第3行 1 1 0
第4行 1 1 0

我們DDL修改字段的NULL屬性的時(shí)候并不能通過(guò)修改數(shù)據(jù)字典來(lái)快速完成,我覺(jué)得修改更改ibd文件的實(shí)際內(nèi)容是其中很大的一部分原因杜耙。下面是我修改NULL屬性的記錄搜骡,具體參考官方文檔。

設(shè)置NULL和NOT NULL屬性

都是inplace方式佑女,因?yàn)樾枰薷腘ULL位圖 因此都需要重組记靡,代價(jià)較高
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;

七、如何證明rowid的存在团驱?

這一點(diǎn)實(shí)際上也很好證明摸吠,我們先來(lái)建立一個(gè)不包含主鍵并且插入一條記錄如下:

drop table baguait1;
create table baguait1(id int ,c1 varchar(20) ,c2 varchar(20),c3 char(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into baguait1 values(1,NULL,'gaopeng','gaopeng');

mysql> select * from baguait1;
+------+------+---------+---------+
| id   | c1   | c2      | c3      |
+------+------+---------+---------+
|    1 | NULL | gaopeng | gaopeng |
+------+------+---------+---------+
1 row in set (0.00 sec)

使用innblock掃描發(fā)現(xiàn)其只包含了1個(gè)塊如下:

[root@gp1 test]# ./innblock baguait1.ibd scan 16
...
Datafile Total Size:98304
===INDEX_ID:325
level0 total block is (1)
block_no:         3,level:   0|*|

然后掃描這個(gè)塊如下:

[root@gp1 test]# ./innblock baguait1.ibd 3 16

...
==== Block list info ====
-----Total used rows:3 used rows list(logic):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) normal record offset:128 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0
(3) SUPREMUM record offset:112 heapno:1 n_owned 2,delflag:N minflag:0 rectype:3
-----Total used rows:3 used rows list(phy):
(1) INFIMUM record offset:99 heapno:0 n_owned 1,delflag:N minflag:0 rectype:2
(2) SUPREMUM record offset:112 heapno:1 n_owned 2,delflag:N minflag:0 rectype:3
(3) normal record offset:128 heapno:2 n_owned 0,delflag:N minflag:0 rectype:0

然后使用bcview查看(offset:128 )這條記錄如下:

[root@gp1 test]# ./bcview baguait1.ibd 16 128 60 |grep 00000003
current block:00000003--Offset:00128--cnt bytes:60--data is:000001ac310000000005d97fea0000002c01108000000167616f70656e6767616f70656e672020202020202020202020202000000000000000000000

我們來(lái)解析一下:

  • 000001ac3100:rowid 6字節(jié),上面的測(cè)試中這里是主鍵定義的相關(guān)字段值
  • 00000005d97f:trx id 6字節(jié)
  • ea0000002c0110:roll ptr 7字節(jié)
  • 80000001:第1個(gè)字段值 1
  • 67616f70656e67:第2個(gè)字段值 ‘gaopeng’的ASCII編碼
  • 67616f70656e6720202020202020202020202020:第4個(gè)字段值‘gaopeng’的ASCII編碼嚎花,并且char有0X20補(bǔ)足20字節(jié)寸痢。

最后:

當(dāng)然這里只是列舉了一些例子來(lái)說(shuō)明工具的使用方式,可以按照你的需求方便的從ibd文件中提取出你感興趣的信息紊选。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轿腺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丛楚,更是在濱河造成了極大的恐慌族壳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣些,死亡現(xiàn)場(chǎng)離奇詭異仿荆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)坏平,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)拢操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人舶替,你說(shuō)我怎么就攤上這事令境。” “怎么了顾瞪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵舔庶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陈醒,道長(zhǎng)惕橙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任钉跷,我火速辦了婚禮弥鹦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爷辙。我一直安慰自己彬坏,他們只是感情好朦促,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著栓始,像睡著了一般务冕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上混滔,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天洒疚,我揣著相機(jī)與錄音歹颓,去河邊找鬼坯屿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巍扛,可吹牛的內(nèi)容都是我干的领跛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撤奸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吠昭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胧瓜,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矢棚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后府喳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蒲肋,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年钝满,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兜粘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弯蚜,死狀恐怖孔轴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碎捺,我是刑警寧澤路鹰,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站收厨,受9級(jí)特大地震影響悍引,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帽氓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一趣斤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黎休,春花似錦浓领、人聲如沸玉凯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漫仆。三九已至,卻和暖如春泪幌,著一層夾襖步出監(jiān)牢的瞬間盲厌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工祸泪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吗浩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓没隘,卻偏偏與公主長(zhǎng)得像懂扼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子右蒲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348