SQL優(yōu)化

MySQL優(yōu)化


體系結(jié)構(gòu)

MySQL Server由以下組成:Connection Pool(連接池組件)姨拥;Management Service & Utilities(管理服務(wù)和工具組件)翁逞;SQL Interface崖媚;Optimizer梗劫;Caches & Buffers享甸;Pluggable Storage Engines(索引依靠于存儲引擎)截碴;File System;

索引

索引:幫助MySQL高校獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)蛉威。

索引設(shè)計原則

以下情況推薦建立索引:

  1. 主鍵自動建立唯一索引
  2. 頻繁作為查詢條件的字段
  3. 查詢中與其他表關(guān)聯(lián)的字段日丹,外鍵關(guān)系建立索引
  4. 單鍵/組合索引的選擇問題,高并發(fā)下傾向創(chuàng)建組合索引
  5. 查詢中排序的字段蚯嫌,排序字段通過索引訪問大幅提高排序速度
  6. 查詢中統(tǒng)計或分組字段

同時哲虾,設(shè)計索引時可以遵循一些原則:

  1. 對查詢頻次較高,且數(shù)據(jù)量比較大的表建立索引齐帚;
  2. 索引字段的選擇妒牙,最佳候選應(yīng)當(dāng)從where子句中的條件中提取对妄;
  3. 使用唯一索引湘今,區(qū)分度越高,使用索引的效率越高剪菱;
  4. 索引越多越不易維護(hù)摩瞎;
  5. 使用短索引,索引創(chuàng)建后使用硬盤存儲孝常,短索引可以提升索引訪問的I/O效率旗们,可以提升總體的訪問效率;
  6. 利用符合索引构灸,對N個列組合而成的組合索引上渴,就相當(dāng)于創(chuàng)建了N個索引,如果查詢時where子句中使用了組成該索引的前幾個字段喜颁,那么這條查詢SQL可以利用組合索引來提升查詢效率稠氮。

SQL性能監(jiān)測

查看SQL執(zhí)行頻率

以下命令顯示當(dāng)前session中所有統(tǒng)計參數(shù)的值:

show status like 'Com_______';

可以查看當(dāng)前數(shù)據(jù)庫以什么操作為主:

mysql> show status like 'Com_______';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_binlog    | 0     |
| Com_commit    | 0     |
| Com_delete    | 0     |
| Com_import    | 0     |
| Com_insert    | 0     |
| Com_repair    | 0     |
| Com_revoke    | 0     |
| Com_select    | 10    |
| Com_signal    | 0     |
| Com_update    | 0     |
| Com_xa_end    | 0     |
+---------------+-------+
11 rows in set (0.10 sec)

explain分析執(zhí)行計劃

explain select * from cnarea_2019 where id = 1;
image-20210305105526395

關(guān)于參數(shù)的初步解釋可以查看參考一。

慢查詢?nèi)罩?/h3>

默認(rèn)關(guān)閉半开。

show variables like 'slow_query%';
show variables like 'long_query%';
# 臨時開啟
set global slow_query_log_file='/var/lib/mysql/tmp_slow.log';
set global long_query_time=1;
set global slow_query_log='ON';
image-20210305132149856

生成的文件格式如下:

image-20210305132605864

包含用戶隔披、數(shù)據(jù)庫地址以及詳細(xì)的SQL語句。

索引的使用

索引驗證

在測試索引之前寂拆,我們先準(zhǔn)備一張500萬左右的數(shù)據(jù)表:

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|  4999865 |
+----------+
1 row in set (2.51 sec)

mysql> select * from user limit 3;
+----+------------+------+------------+------------+
| id | username   | age  | address    | company    |
+----+------------+------+------------+------------+
|  1 | 88094c37-b |   54 | ecf48a5c-9 | e244831c-6 |
|  2 | 79c2f062-c |   71 | a03f8695-d | bd040bfb-1 |
|  3 | 18dd03ab-9 |   51 | 3332d698-a | 4b4fc273-a |
+----+------------+------+------------+------------+
3 rows in set (0.01 sec)

存儲一些隨機生成的數(shù)據(jù)奢米。

當(dāng)前表除主鍵外并沒有索引。

mysql> select * from user where id = 3000000;
+---------+------------+------+------------+------------+
| id      | username   | age  | address    | company    |
+---------+------------+------+------------+------------+
| 3000000 | 3b7df0e5-d |   92 | 425d44f5-a | 2b508d46-0 |
+---------+------------+------+------------+------------+
1 row in set (0.00 sec)

mysql> select * from user where username = '3b7df0e5-d';
+---------+------------+------+------------+------------+
| id      | username   | age  | address    | company    |
+---------+------------+------+------------+------------+
| 3000000 | 3b7df0e5-d |   92 | 425d44f5-a | 2b508d46-0 |
+---------+------------+------+------------+------------+
1 row in set (2.93 sec)

可以看到纠永,通過主鍵ID進(jìn)行查詢快于使用username查詢鬓长,接下來我們?yōu)閡sername添加索引。

mysql> create index ind_username on user(username);
Query OK, 0 rows affected (32.32 sec)
Records: 0  Duplicates: 0  Warnings: 0

再進(jìn)行測試:

mysql> select * from user where id = 4320000;
+---------+------------+------+------------+------------+
| id      | username   | age  | address    | company    |
+---------+------------+------+------------+------------+
| 4320000 | dce56995-b |   26 | bc64326a-e | b01d5ba2-8 |
+---------+------------+------+------------+------------+
1 row in set (0.00 sec)

mysql> select * from user where username = "dce56995-b";
+---------+------------+------+------------+------------+
| id      | username   | age  | address    | company    |
+---------+------------+------+------------+------------+
| 4320000 | dce56995-b |   26 | bc64326a-e | b01d5ba2-8 |
+---------+------------+------+------------+------------+
1 row in set (0.00 sec)

建立索引后數(shù)據(jù)查詢效率與主鍵查詢速度相當(dāng)渺蒿。

索引使用

刪除之前的索引

mysql> drop index ind_username on user;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

為username痢士、age、addresss創(chuàng)建復(fù)合索引:

mysql> create index ind_username_age_address on user(username,age,address);
Query OK, 0 rows affected (46.24 sec)
Records: 0  Duplicates: 0  Warnings: 0

先使用explain觀察SQL執(zhí)行計劃

mysql> explain select * from user where username = "dce56995-b" and age = 26 and company = "b01d5ba2-8"\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ref
possible_keys: ind_username_age_address
          key: ind_username_age_address
      key_len: 88
          ref: const,const
         rows: 1
     filtered: 10.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

mysql> explain select * from user where username = "dce56995-b" and age = 26\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ref
possible_keys: ind_username_age_address
          key: ind_username_age_address
      key_len: 88
          ref: const,const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

mysql> explain select * from user where username = "dce56995-b"\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ref
possible_keys: ind_username_age_address
          key: ind_username_age_address
      key_len: 83
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

可以看到以上三個查詢條件都可以走ind_username_age_address索引。

再看以下例子

mysql> explain select * from user where age = 26 and username = "dce56995-b"\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ref
possible_keys: ind_username_age_address
          key: ind_username_age_address
      key_len: 88
          ref: const,const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

交換and左右條件該走索引依然會走怠蹂。

但是如果查詢未經(jīng)過最左邊的列時便不會走索引

mysql> explain select * from user where age = 26 and address = "dce56995-b"\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4981012
     filtered: 1.00
        Extra: Using where
1 row in set, 1 warning (0.01 sec)

ERROR: 
No query specified

下面總結(jié)了索引失效的可能原因善延。

索引失效

  1. 不符合最左匹配原則

    mysql> explain select * from user where  age = 26 and company = "b01d5ba2-8"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 4981012
         filtered: 1.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    
  2. 復(fù)合索引中范圍查詢右邊的列

    MySQL8中測試仍會走索引

    mysql> explain select * from user where username = "adb-5" and age > 64 and company = "e938fd76-e"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: range
    possible_keys: ind_username_age_address
              key: ind_username_age_address
          key_len: 88
              ref: NULL
             rows: 1
         filtered: 10.00
            Extra: Using index condition; Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    
    mysql> explain select * from user where username = "adb-5" and age = 64 and company = "e938fd76-e"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ref
    possible_keys: ind_username_age_address
              key: ind_username_age_address
          key_len: 88
              ref: const,const
             rows: 1
         filtered: 10.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    

    只是type發(fā)生了變化。

  1. like查詢前有‘%’城侧,eg: "%Hello"
    like使用索引如何避免失效

    我測試的時候發(fā)現(xiàn)都會走索引易遣。

    mysql> explain select * from user where username = "%adb-5" and age = 64 and company = "e938fd76-e"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ref
    possible_keys: ind_username_age_address
              key: ind_username_age_address
          key_len: 88
              ref: const,const
             rows: 1
         filtered: 10.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    
    mysql> explain select * from user where username = "adb-5" and age = 64 and company = "%e938fd76-e"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ref
    possible_keys: ind_username_age_address
              key: ind_username_age_address
          key_len: 88
              ref: const,const
             rows: 1
         filtered: 10.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    

    猜測:MySQL8對like模糊查詢進(jìn)行了優(yōu)化。

  1. or連接的條件嫌佑,一個有索引豆茫,一個沒有,則整個索引都失效

    mysql> explain select * from user where username = "adb-5" or company = "Hello"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ALL
    possible_keys: ind_username_age_address
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 4981012
         filtered: 10.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    
  2. 字符串未加單引號屋摇,存在隱式數(shù)據(jù)轉(zhuǎn)換可能導(dǎo)致索引失效

    mysql> explain select * from user where username = 13\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ALL
    possible_keys: ind_username_age_address
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 4981012
         filtered: 10.00
            Extra: Using where
    1 row in set, 3 warnings (0.00 sec)
    
    ERROR: 
    No query specified
    
  3. 在索引列上進(jìn)行運算操作

    mysql> explain select * from user where substring(username,2,3) = "abc"\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
       partitions: NULL
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 4981012
         filtered: 100.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    ERROR: 
    No query specified
    
  4. MySQL內(nèi)部優(yōu)化(MySQL覺得全表掃描會更快)

    回表:簡單來說就是數(shù)據(jù)庫根據(jù)索引(非主鍵)找到了指定的記錄所在行后揩魂,還需要根據(jù)主鍵再次到數(shù)據(jù)塊里獲取數(shù)據(jù)。

常見SQL優(yōu)化

主鍵優(yōu)化

沒有特別的需要的話盡量使用一個與業(yè)務(wù)無關(guān)的自增字段作為主鍵炮温。

原因:1.占用空間谢鹇觥;2.插入搜索快柒啤;3.檢索搜索快

優(yōu)化insert語句

1.如果需要同時對一張表插入很多數(shù)據(jù)時倦挂,盡量使用多個值表的insert語句。

insert into user(username,age) values("Hello",3),("World",4);

2.在事務(wù)中進(jìn)行數(shù)據(jù)插入担巩。

start transaction;
insert into user(username,age) values("Hello",3);
commit;

3.主鍵有序插入方援。

優(yōu)化order by語句

mysql> explain select age,username from user order by age limit 10\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: index
possible_keys: NULL
          key: ind_username_age_address
      key_len: 1111
          ref: NULL
         rows: 4981014
     filtered: 100.00
        Extra: Using index; Using filesort
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

mysql> explain select age,username,company from user order by age limit 10\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4981014
     filtered: 100.00
        Extra: Using filesort
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

索引覆蓋:所要查詢的列已包含在索引中,不需要再查詢主表涛癌。

Extra中為Using Index

第一條語句中的age犯戏,username都有對應(yīng)的索引,而第二條語句中的company沒有對應(yīng)的索引拳话。所以第一條語句做到了索引覆蓋笛丙,查詢效率更優(yōu)。

MySQL5.x分組后會進(jìn)行排序假颇,而8則不會。要禁用排序可以用 order by null

優(yōu)化嵌套查詢

MySQL 4.1版本之后骨稿,開始支持SQL的子查詢笨鸡。這個技術(shù)可以使用SELECT語句來創(chuàng)建一個單列的查詢結(jié)果, 然后把這個結(jié)果作為過濾條件用在另一個查詢中坦冠。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作形耗,同時也可以避免事務(wù)或者表鎖死,并且寫起來也很容易辙浑。但是激涤,有些情況下,子查詢是可以被更高效的連接(JOIN) 替代判呕。

示例倦踢,查找有角色的所有的用戶信息(子查詢):

 select * from t_user where id in (select user_id from user_role);

優(yōu)化后(多表聯(lián)查):

select * from t_user u, user_role ur where u.id = ur.user_id;

優(yōu)化分頁

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|  4999867 |
+----------+
1 row in set (3.03 sec)

mysql> select * from user limit 4000000,10;
+---------+------------+------+------------+------------+
| id      | username   | age  | address    | company    |
+---------+------------+------+------------+------------+
| 4000001 | 273b8cfa-8 |   14 | 8ac53fae-8 | 58682f84-1 |
| 4000002 | e15525b4-7 |   84 | 6c462c67-5 | 86d91e7c-3 |
| 4000003 | 96db55fb-f |   15 | d64c3ca8-4 | 83c58363-1 |
| 4000004 | ed3d258a-a |   76 | d7ef91ef-9 | 1179e728-3 |
| 4000005 | c03a8321-b |   15 | 176320ef-6 | 109928fe-8 |
| 4000006 | 5ca5eba0-2 |   97 | 06d920cd-7 | 5f37f70e-a |
| 4000007 | ed5500ac-4 |   17 | a49b060b-4 | b92af423-a |
| 4000008 | 659d36ca-d |   57 | 3ec9420a-7 | 048298c2-5 |
| 4000009 | 40e965ba-1 |   96 | 778e34c3-4 | de69750e-d |
| 4000010 | 3d9146e1-0 |    1 | acc5050f-b | 59a0e1a9-6 |
+---------+------------+------+------------+------------+
10 rows in set (2.41 sec)

分頁查詢很慢送滞,可以進(jìn)行如下優(yōu)化(多表聯(lián)查)

mysql> select * from user u, (select id from user order by id limit 4000000,10) a where u.id = a.id;
+---------+------------+------+------------+------------+---------+
| id      | username   | age  | address    | company    | id      |
+---------+------------+------+------------+------------+---------+
| 4000001 | 273b8cfa-8 |   14 | 8ac53fae-8 | 58682f84-1 | 4000001 |
| 4000002 | e15525b4-7 |   84 | 6c462c67-5 | 86d91e7c-3 | 4000002 |
| 4000003 | 96db55fb-f |   15 | d64c3ca8-4 | 83c58363-1 | 4000003 |
| 4000004 | ed3d258a-a |   76 | d7ef91ef-9 | 1179e728-3 | 4000004 |
| 4000005 | c03a8321-b |   15 | 176320ef-6 | 109928fe-8 | 4000005 |
| 4000006 | 5ca5eba0-2 |   97 | 06d920cd-7 | 5f37f70e-a | 4000006 |
| 4000007 | ed5500ac-4 |   17 | a49b060b-4 | b92af423-a | 4000007 |
| 4000008 | 659d36ca-d |   57 | 3ec9420a-7 | 048298c2-5 | 4000008 |
| 4000009 | 40e965ba-1 |   96 | 778e34c3-4 | de69750e-d | 4000009 |
| 4000010 | 3d9146e1-0 |    1 | acc5050f-b | 59a0e1a9-6 | 4000010 |
+---------+------------+------+------------+------------+---------+
10 rows in set (2.24 sec)

也可以用如下方式

mysql> select * from user where id > 4000000 limit 10;
+---------+------------+------+------------+------------+
| id      | username   | age  | address    | company    |
+---------+------------+------+------------+------------+
| 4000001 | 273b8cfa-8 |   14 | 8ac53fae-8 | 58682f84-1 |
| 4000002 | e15525b4-7 |   84 | 6c462c67-5 | 86d91e7c-3 |
| 4000003 | 96db55fb-f |   15 | d64c3ca8-4 | 83c58363-1 |
| 4000004 | ed3d258a-a |   76 | d7ef91ef-9 | 1179e728-3 |
| 4000005 | c03a8321-b |   15 | 176320ef-6 | 109928fe-8 |
| 4000006 | 5ca5eba0-2 |   97 | 06d920cd-7 | 5f37f70e-a |
| 4000007 | ed5500ac-4 |   17 | a49b060b-4 | b92af423-a |
| 4000008 | 659d36ca-d |   57 | 3ec9420a-7 | 048298c2-5 |
| 4000009 | 40e965ba-1 |   96 | 778e34c3-4 | de69750e-d |
| 4000010 | 3d9146e1-0 |    1 | acc5050f-b | 59a0e1a9-6 |
+---------+------------+------+------------+------------+
10 rows in set (0.00 sec)

參考

  1. 高性能Mysql優(yōu)化實戰(zhàn)*
  2. SQL執(zhí)行計劃詳解explain
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辱挥,隨后出現(xiàn)的幾起案子犁嗅,更是在濱河造成了極大的恐慌,老刑警劉巖晤碘,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褂微,死亡現(xiàn)場離奇詭異,居然都是意外死亡园爷,警方通過查閱死者的電腦和手機宠蚂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來童社,“玉大人求厕,你說我怎么就攤上這事〉矗” “怎么了甘改?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灭抑。 經(jīng)常有香客問我十艾,道長,這世上最難降的妖魔是什么腾节? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任忘嫉,我火速辦了婚禮,結(jié)果婚禮上案腺,老公的妹妹穿的比我還像新娘庆冕。我一直安慰自己,他們只是感情好劈榨,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布访递。 她就那樣靜靜地躺著,像睡著了一般同辣。 火紅的嫁衣襯著肌膚如雪拷姿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天旱函,我揣著相機與錄音响巢,去河邊找鬼。 笑死棒妨,一個胖子當(dāng)著我的面吹牛踪古,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼伏穆,長吁一口氣:“原來是場噩夢啊……” “哼拘泞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜈出,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤田弥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铡原,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偷厦,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年燕刻,在試婚紗的時候發(fā)現(xiàn)自己被綠了只泼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卵洗,死狀恐怖请唱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情过蹂,我是刑警寧澤十绑,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站酷勺,受9級特大地震影響本橙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脆诉,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一甚亭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧击胜,春花似錦亏狰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辰斋,卻和暖如春信不,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亡呵。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硫戈,地道東北人锰什。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汁胆。 傳聞我的和親對象是個殘疾皇子梭姓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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