MySQL之explain介紹

7.2.1. EXPLAIN語法(獲取SELECT相關(guān)信息)

EXPLAINtbl_name

或:

EXPLAIN [EXTENDED] SELECTselect_options

EXPLAIN語句可以用作DESCRIBE的一個同義詞涮因,或獲得關(guān)于MySQL如何執(zhí)行SELECT語句的信息:

·EXPLAINtbl_name是DESCRIBEtbl_name或SHOW COLUMNS FROMtbl_name的一個同義詞。

·如果在SELECT語句前放上關(guān)鍵詞EXPLAIN伺绽,MySQL將解釋它如何處理SELECT养泡,提供有關(guān)表如何聯(lián)接和聯(lián)接的次序。

該節(jié)解釋EXPLAIN的第2個用法奈应。

借助于EXPLAIN澜掩,可以知道什么時候必須為表加入索引以得到一個使用索引來尋找記錄的更快的SELECT。

如果由于使用不正確的索引出現(xiàn)了問題杖挣,應(yīng)運行ANALYZE

TABLE更新表的統(tǒng)計(例如關(guān)鍵字集的勢)肩榕,這樣會影響優(yōu)化器進行的選擇。參見13.5.2.1節(jié)惩妇,“ANALYZE TABLE語法”株汉。

還可以知道優(yōu)化器是否以一個最佳次序聯(lián)接表筐乳。為了強制優(yōu)化器讓一個SELECT語句按照表命名順序的聯(lián)接次序,語句應(yīng)以STRAIGHT_JOIN而不只是SELECT開頭乔妈。

EXPLAIN為用于SELECT語句中的每個表返回一行信息哥童。表以它們在處理查詢過程中將被MySQL讀入的順序被列出。MySQL用一遍掃描多次聯(lián)接(single-sweep?multi-join)的方式解決所有聯(lián)接褒翰。這意味著MySQL從第一個表中讀一行贮懈,然后找到在第二個表中的一個匹配行,然后在第3個表中等等优训。當所有的表處理完后朵你,它輸出選中的列并且返回表清單直到找到一個有更多的匹配行的表。從該表讀入下一行并繼續(xù)處理下一個表揣非。

當使用EXTENDED關(guān)鍵字時抡医,EXPLAIN產(chǎn)生附加信息,可以用SHOW WARNINGS瀏覽早敬。該信息顯示優(yōu)化器限定SELECT語句中的表和列名忌傻,重寫并且執(zhí)行優(yōu)化規(guī)則后SELECT語句是什么樣子,并且還可能包括優(yōu)化過程的其它注解搞监。

EXPLAIN的每個輸出行提供一個表的相關(guān)信息水孩,并且每個行包括下面的列:

·id

SELECT識別符。這是SELECT的查詢序列號琐驴。

·select_type

SELECT類型俘种,可以為以下任何一種:

oSIMPLE

簡單SELECT(不使用UNION或子查詢)

oPRIMARY

最外面的SELECT

oUNION

UNION中的第二個或后面的SELECT語句

oDEPENDENT UNION

UNION中的第二個或后面的SELECT語句,取決于外面的查詢

oUNION RESULT

UNION的結(jié)果绝淡。

oSUBQUERY

子查詢中的第一個SELECT

oDEPENDENT SUBQUERY

子查詢中的第一個SELECT宙刘,取決于外面的查詢

oDERIVED

導(dǎo)出表的SELECT(FROM子句的子查詢)

·table

輸出的行所引用的表。

·type

聯(lián)接類型牢酵。下面給出各種聯(lián)接類型悬包,按照從最佳類型到最壞類型進行排序:

osystem

表僅有一行(=系統(tǒng)表)。這是const聯(lián)接類型的一個特例馍乙。

oconst

表最多有一個匹配行布近,它將在查詢開始時被讀取。因為僅有一行潘拨,在這行的列值可被優(yōu)化器剩余部分認為是常數(shù)吊输。const表很快,因為它們只讀取一次铁追!

const用于用常數(shù)值比較PRIMARY

KEY或UNIQUE索引的所有部分時季蚂。在下面的查詢中,tbl_name可以用于const表:

SELECT * fromtbl_nameWHEREprimary_key=1;

SELECT * fromtbl_name

WHEREprimary_key_part1=1和primary_key_part2=2扭屁;

oeq_ref

對于每個來自于前面的表的行組合算谈,從該表中讀取一行。這可能是最好的聯(lián)接類型料滥,除了const類型然眼。它用在一個索引的所有部分被聯(lián)接使用并且索引是UNIQUE或PRIMARY

KEY。

eq_ref可以用于使用=操作符比較的帶索引的列葵腹。比較值可以為常量或一個使用在該表前面所讀取的表的列的表達式高每。

在下面的例子中,MySQL可以使用eq_ref聯(lián)接來處理ref_tables

SELECT * FROMref_table,other_table

WHEREref_table.key_column=other_table.column;

SELECT * FROMref_table,other_table

WHEREref_table.key_column_part1=other_table.column

ANDref_table.key_column_part2=1;

oref

對于每個來自于前面的表的行組合践宴,所有有匹配索引值的行將從這張表中讀取鲸匿。如果聯(lián)接只使用鍵的最左邊的前綴,或如果鍵不是UNIQUE或PRIMARY

KEY(換句話說阻肩,如果聯(lián)接不能基于關(guān)鍵字選擇單個行的話)带欢,則使用ref。如果使用的鍵僅僅匹配少量行烤惊,該聯(lián)接類型是不錯的乔煞。

ref可以用于使用=或<=>操作符的帶索引的列。

在下面的例子中柒室,MySQL可以使用ref聯(lián)接來處理ref_tables

SELECT * FROMref_tableWHEREkey_column=expr;

SELECT * FROMref_table,other_table

WHEREref_table.key_column=other_table.column;

SELECT * FROMref_table,other_table

WHEREref_table.key_column_part1=other_table.column

ANDref_table.key_column_part2=1;

oref_or_null

該聯(lián)接類型如同ref渡贾,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經(jīng)常使用該聯(lián)接類型的優(yōu)化伦泥。

在下面的例子中剥啤,MySQL可以使用ref_or_null聯(lián)接來處理ref_tables

SELECT * FROMref_table

WHEREkey_column=exprORkey_columnIS NULL;

參見7.2.7節(jié)锦溪,“MySQL如何優(yōu)化IS NULL”不脯。

oindex_merge

該聯(lián)接類型表示使用了索引合并優(yōu)化方法。在這種情況下刻诊,key列包含了使用的索引的清單防楷,key_len包含了使用的索引的最長的關(guān)鍵元素。詳細信息參見7.2.6節(jié)则涯,“索引合并優(yōu)化”复局。

ounique_subquery

該類型替換了下面形式的IN子查詢的ref:

valueIN (SELECTprimary_keyFROMsingle_tableWHEREsome_expr)

unique_subquery是一個索引查找函數(shù),可以完全替換子查詢粟判,效率更高亿昏。

oindex_subquery

該聯(lián)接類型類似于unique_subquery〉到福可以替換IN子查詢角钩,但只適合下列形式的子查詢中的非唯一索引:

valueIN (SELECTkey_columnFROMsingle_tableWHEREsome_expr)

orange

只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引递礼。key_len包含所使用索引的最長關(guān)鍵元素惨险。在該類型中ref列為NULL。

當使用=脊髓、<>辫愉、>、>=将硝、<恭朗、<=、IS

NULL依疼、<=>冀墨、BETWEEN或者IN操作符,用常量比較關(guān)鍵字列時涛贯,可以使用range:

SELECT * FROMtbl_name

WHEREkey_column= 10;

SELECT * FROMtbl_name

WHEREkey_columnBETWEEN 10 and 20;

SELECT * FROMtbl_name

WHEREkey_columnIN (10,20,30);

SELECT * FROMtbl_name

WHEREkey_part1= 10 ANDkey_part2IN (10,20,30);

oindex

該聯(lián)接類型與ALL相同诽嘉,除了只有索引樹被掃描。這通常比ALL快弟翘,因為索引文件通常比數(shù)據(jù)文件小虫腋。

當查詢只使用作為單索引一部分的列時,MySQL可以使用該聯(lián)接類型稀余。

oALL

對于每個來自于先前的表的行組合悦冀,進行完整的表掃描。如果表是第一個沒標記const的表睛琳,這通常不好盒蟆,并且通常在它情況下差。通呈ζ可以增加更多的索引而不要使用ALL历等,使得行能基于前面的表中的常數(shù)值或列值被檢索出。

·possible_keys

possible_keys列指出MySQL能使用哪個索引在該表中找到行辟癌。注意寒屯,該列完全獨立于EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實際上不能按生成的表次序使用黍少。

如果該列是NULL寡夹,則沒有相關(guān)的索引。在這種情況下厂置,可以通過檢查WHERE子句看是否它引用某些列或適合索引的列來提高你的查詢性能菩掏。如果是這樣,創(chuàng)造一個適當?shù)乃饕⑶以俅斡肊XPLAIN檢查查詢昵济。參見13.1.2節(jié)智绸,“ALTER TABLE語法”或颊。

為了看清一張表有什么索引,使用SHOW INDEX FROMtbl_name传于。

·key

key列顯示MySQL實際決定使用的鍵(索引)囱挑。如果沒有選擇索引,鍵是NULL沼溜。要想強制MySQL使用或忽視possible_keys列中的索引平挑,在查詢中使用FORCE

INDEX、USE INDEX或者IGNORE INDEX系草。參見13.2.7節(jié)通熄,“SELECT語法”

對于MyISAM和BDB表找都,運行ANALYZE

TABLE可以幫助優(yōu)化器選擇更好的索引唇辨。對于MyISAM表,可以使用myisamchk

--analyze能耻。參見13.5.2.1節(jié)赏枚,“ANALYZE TABLE語法”5.9.4節(jié),“表維護和崩潰恢復(fù)”晓猛。

·key_len

key_len列顯示MySQL決定使用的鍵長度遥倦。如果鍵是NULL轰枝,則長度為NULL谈息。注意通過key_len值我們可以確定MySQL將實際使用一個多部關(guān)鍵字的幾個部分绢陌。

·ref

ref列顯示使用哪個列或常數(shù)與key一起從表中選擇行。

·rows

rows列顯示MySQL認為它執(zhí)行查詢時必須檢查的行數(shù)洪燥。

·Extra

該列包含MySQL解決查詢的詳細信息磕秤。下面解釋了該列可以顯示的不同的文本字符串:

oDistinct

MySQL發(fā)現(xiàn)第1個匹配行后,停止為當前的行組合搜索更多的行捧韵。

oNot exists

MySQL能夠?qū)Σ樵冞M行LEFT

JOIN優(yōu)化市咆,發(fā)現(xiàn)1個匹配LEFT

JOIN標準的行后,不再為前面的的行組合在該表內(nèi)檢查更多的行纫版。

下面是一個可以這樣優(yōu)化的查詢類型的例子:

SELECT *從t1 LEFT JOIN t2 ON t1.id=t2.id

WHERE t2.id IS NULL床绪;

假定t2.id定義為NOT

NULL。在這種情況下其弊,MySQL使用t1.id的值掃描t1并查找t2中的行。如果MySQL在t2中發(fā)現(xiàn)一個匹配的行膀斋,它知道t2.id絕不會為NULL梭伐,并且不再掃描t2內(nèi)有相同的id值的行。換句話說仰担,對于t1的每個行糊识,MySQL只需要在t2中查找一次绩社,無論t2內(nèi)實際有多少匹配的行。

orange checked for each record

(index map:#)

MySQL沒有發(fā)現(xiàn)好的可以使用的索引赂苗,但發(fā)現(xiàn)如果來自前面的表的列值已知愉耙,可能部分索引可以使用。對前面的表的每個行組合拌滋,MySQL檢查是否可以使用range或index_merge訪問方法來索取行朴沿。關(guān)于適用性標準的描述參見7.2.5節(jié),“范圍優(yōu)化”7.2.6節(jié)败砂,“索引合并優(yōu)化”赌渣,不同的是前面表的所有列值已知并且認為是常量。

這并不很快昌犹,但比執(zhí)行沒有索引的聯(lián)接要快得多坚芜。

oUsing filesort

MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行斜姥。通過根據(jù)聯(lián)接類型瀏覽所有行并為所有匹配WHERE子句的行保存排序關(guān)鍵字和行的指針來完成排序鸿竖。然后關(guān)鍵字被排序,并按排序順序檢索行铸敏。參見7.2.12節(jié)千贯,“MySQL如何優(yōu)化ORDER BY”

oUsing index

從只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的列信息搞坝。當查詢只使用作為單一索引一部分的列時搔谴,可以使用該策略。

oUsing temporary

為了解決查詢桩撮,MySQL需要創(chuàng)建一個臨時表來容納結(jié)果敦第。典型情況如查詢包含可以按不同情況列出列的GROUP

BY和ORDER BY子句時。

oUsing where

WHERE子句用于限制哪一個行匹配下一個表或發(fā)送到客戶店量。除非你專門從表中索取或檢查所有行芜果,如果Extra值不為Using

where并且表聯(lián)接類型為ALL或index,查詢可能會有一些錯誤融师。

如果想要使查詢盡可能快右钾,應(yīng)找出Using filesort和Using

temporary的Extra值。

oUsing sort_union(...),Using union(...),Using

intersect(...)

這些函數(shù)說明如何為index_merge聯(lián)接類型合并索引掃描旱爆。詳細信息參見7.2.6節(jié)舀射,“索引合并優(yōu)化”

oUsing index for group-by

類似于訪問表的Using index方式怀伦,Using index for

group-by表示MySQL發(fā)現(xiàn)了一個索引脆烟,可以用來查詢GROUP

BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實際的表房待。并且邢羔,按最有效的方式使用索引驼抹,以便對于每個組,只讀取少量索引條目拜鹤。詳情參見7.2.13節(jié)框冀,“MySQL如何優(yōu)化GROUP BY”

通過相乘EXPLAIN輸出的rows列的所有值敏簿,你能得到一個關(guān)于一個聯(lián)接如何的提示明也。這應(yīng)該粗略地告訴你MySQL必須檢查多少行以執(zhí)行查詢。當你使用max_join_size變量限制查詢時极谊,也用這個乘積來確定執(zhí)行哪個多表SELECT語句诡右。參見7.5.2節(jié),“調(diào)節(jié)服務(wù)器參數(shù)”轻猖。

下列例子顯示出一個多表JOIN如何能使用EXPLAIN提供的信息逐步被優(yōu)化帆吻。

假定你有下面所示的SELECT語句,計劃使用EXPLAIN來檢查它:

EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,

tt.ProjectReference, tt.EstimatedShipDate,

tt.ActualShipDate, tt.ClientID,

tt.ServiceCodes, tt.RepetitiveID,

tt.CurrentProcess, tt.CurrentDPPerson,

tt.RecordVolume, tt.DPPrinted, et.COUNTRY,

et_1.COUNTRY, do.CUSTNAME

FROM tt, et, et AS et_1, do

WHERE tt.SubmitTime IS NULL

AND tt.ActualPC = et.EMPLOYID

AND tt.AssignedPC = et_1.EMPLOYID

AND tt.ClientID = do.CUSTNMBR;

對于這個例子咙边,假定:

·被比較的列聲明如下:

列類型

tt

ActualPC

CHAR(10)

tt

AssignedPC

CHAR(10)

tt

ClientID

CHAR(10)

et

EMPLOYID

CHAR(15)

do

CUSTNMBR

CHAR(15)

·表有下面的索引:

索引

tt

ActualPC

tt

AssignedPC

tt

ClientID

et

EMPLOYID(主鍵)

do

CUSTNMBR(主鍵)

·tt.ActualPC值不是均勻分布的猜煮。

開始,在進行優(yōu)化前败许,EXPLAIN語句產(chǎn)生下列信息:

table type possible_keys key? key_len ref? rows? Extra

et??? ALL? PRIMARY?????? NULL NULL??? NULL 74

do??? ALL? PRIMARY?????? NULL NULL??? NULL 2135

et_1? ALL? PRIMARY?????? NULL NULL??? NULL 74

tt??? ALL? AssignedPC,?? NULL NULL??? NULL 3872

ClientID,

ActualPC

range checked for each record (key map: 35)

因為type對每張表是ALL王带,這個輸出顯示MySQL正在對所有表產(chǎn)生一個笛卡爾乘積;即每一個行的組合市殷!這將花相當長的時間愕撰,因為必須檢查每張表的行數(shù)的乘積!對于一個實例醋寝,這是74

* 2135 * 74 * 3872 = 45,268,558,720行搞挣。如果表更大,你只能想象它將花多長時間……

這里的一個問題是MySQL能更高效地在聲明具有相同類型和尺寸的列上使用索引音羞。在本文中囱桨,VARCHAR和CHAR是相同的,除非它們聲明為不同的長度嗅绰。因為tt.ActualPC被聲明為CHAR(10)并且et.EMPLOYID被聲明為CHAR(15)舍肠,長度不匹配。

為了修正在列長度上的不同窘面,使用ALTER

TABLE將ActualPC的長度從10個字符變?yōu)?5個字符:

mysql>ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

現(xiàn)在tt.ActualPC和et.EMPLOYID都是VARCHAR(15)翠语,再執(zhí)行EXPLAIN語句產(chǎn)生這個結(jié)果:

table type?? possible_keys key???? key_len ref???????? rows??? Extra

tt??? ALL ???AssignedPC,?? NULL??? NULL??? NULL??????? 3872??? Using

ClientID,???????????????????????????????????????? where

ActualPC

do??? ALL??? PRIMARY?????? NULL??? NULL??? NULL??????? 2135

range checked for each record (key map: 1)

et_1? ALL??? PRIMARY?????? NULL??? NULL??? NULL??????? 74

range checked for each record (key map: 1)

et??? eq_ref PRIMARY?????? PRIMARY 15????? tt.ActualPC 1

這不是完美的,但是好一些了:rows值的乘積少了一個因子74民镜。這個版本在幾秒內(nèi)執(zhí)行完啡专。

第2種方法能消除tt.AssignedPC =

et_1.EMPLOYID和tt.ClientID = do.CUSTNMBR比較的列的長度失配問題:

mysql>ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),

->MODIFY ClientID?? VARCHAR(15);

EXPLAIN產(chǎn)生的輸出顯示在下面:

table type?? possible_keys key????? key_len ref?????????? rows Extra

et??? ALL??? PRIMARY?????? NULL???? NULL??? NULL????????? 74

tt??? ref??? AssignedPC,?? ActualPC 15????? et.EMPLOYID?? 52?? Using

ClientID,???????????????????????????????????????? where

ActualPC

et_1? eq_ref PRIMARY?????? PRIMARY? 15????? tt.AssignedPC 1

do??? eq_ref PRIMARY?????? PRIMARY? 15????? tt.ClientID?? 1

這幾乎很好了。

剩下的問題是制圈,默認情況们童,MySQL假設(shè)在tt.ActualPC列的值是均勻分布的,并且對tt表不是這樣鲸鹦。幸好慧库,很容易告訴MySQL來分析關(guān)鍵字分布:

mysql>ANALYZE TABLE tt;

現(xiàn)在聯(lián)接是“完美”的了馋嗜,而且EXPLAIN產(chǎn)生這個結(jié)果:

table type?? possible_keys key???? key_len ref?????????? rows Extra

tt??? ALL??? AssignedPC??? NULL??? NULL??? NULL????????? 3872 Using

ClientID,??????????????????????????????????????? where

ActualPC

et??? eq_ref PRIMARY?????? PRIMARY 15????? tt.ActualPC?? 1

et_1? eq_ref PRIMARY?????? PRIMARY 15????? tt.AssignedPC 1

do??? eq_ref PRIMARY?????? PRIMARY 15????? tt.ClientID?? 1

注意在從EXPLAIN輸出的rows列是一個來自MySQL聯(lián)接優(yōu)化器的“教育猜測”齐板。你應(yīng)該檢查數(shù)字是否接近事實。如果不是葛菇,可以通過在SELECT語句里面使用STRAIGHT_JOIN并且試著在FROM子句以不同的次序列出表甘磨,可能得到更好的性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眯停,一起剝皮案震驚了整個濱河市济舆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莺债,老刑警劉巖滋觉,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齐邦,居然都是意外死亡椎侠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門措拇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來我纪,“玉大人,你說我怎么就攤上這事丐吓∏诚ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵汰蜘,是天一觀的道長仇冯。 經(jīng)常有香客問我,道長族操,這世上最難降的妖魔是什么苛坚? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮色难,結(jié)果婚禮上泼舱,老公的妹妹穿的比我還像新娘。我一直安慰自己枷莉,他們只是感情好娇昙,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笤妙,像睡著了一般冒掌。 火紅的嫁衣襯著肌膚如雪噪裕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天股毫,我揣著相機與錄音膳音,去河邊找鬼。 笑死铃诬,一個胖子當著我的面吹牛祭陷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趣席,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兵志,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宣肚?” 一聲冷哼從身側(cè)響起想罕,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钉寝,沒想到半個月后弧呐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嵌纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年俘枫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逮走。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠蚪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出师溅,到底是詐尸還是另有隱情茅信,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布墓臭,位于F島的核電站蘸鲸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窿锉。R本人自食惡果不足惜酌摇,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗡载。 院中可真熱鬧窑多,春花似錦、人聲如沸洼滚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至千康,卻和暖如春享幽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吧秕。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工琉闪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迹炼,地道東北人砸彬。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像斯入,于是被迫代替她去往敵國和親砂碉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容