數(shù)據(jù)庫知識

SQL Select 語句完整的執(zhí)行順序:
FROM-->ON-->OUTER (JOIN)-->WHERE-->GROUP BY-->CUTE|ROLLUP-->HAVING-->SELECT-->DISTINCT-->ORDER BY-->TOP

Mysql 數(shù)據(jù)庫存儲的原理

儲存過程是一個可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存。它可以有 SQL 語句和一些特殊的控制結(jié)構(gòu)組成。當希望在不同的應(yīng)用程序或平臺上執(zhí)行相同的函數(shù),或者封裝特定功能時,存儲過程是非常有用的。數(shù)據(jù)庫中的存儲過程可以看做是對編程中面向?qū)ο蠓椒ǖ哪M。它允許控制數(shù)據(jù)的訪問方式。

存儲過程優(yōu)點

1、存儲過程能實現(xiàn)較快的執(zhí)行速度
2、存儲過程允許標準組件是編程。
3、存儲過程可以用流程控制語句編寫,有很強的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運算。
4、存儲過程可被作為一種安全機制來充分利用。
5、存儲過程能夠減少網(wǎng)絡(luò)流量

事務(wù)的特性(ACID)

1、原子性(Atomicity):事務(wù)中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成,要么均不執(zhí)
行。
2、一致性(Consistency):幾個并行執(zhí)行的事務(wù),其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相
一致。
3、隔離性(Isolation):事務(wù)的執(zhí)行不受其他事務(wù)的干擾,事務(wù)執(zhí)行的中間結(jié)果對其他事務(wù)必須是透
明的。
4、持久性(Durability):對于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對數(shù)據(jù)庫的改變不被丟失,即
使數(shù)據(jù)庫出現(xiàn)故障

隔離級別

1、臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
2、不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果 不一致。
3、幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分數(shù)改為ABCDE等級,但是系統(tǒng)管理員B就在這個時候插入了一條具體分數(shù)的記錄,當系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。
小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表


默認的事務(wù)隔離級別為repeatable-read

數(shù)據(jù)庫索引

數(shù)據(jù)庫索引,是數(shù)據(jù)庫管理系統(tǒng)中一個排序的數(shù)據(jù)結(jié)構(gòu),以協(xié)助快速查詢、更新數(shù)據(jù)庫表中數(shù)據(jù)。索引的實現(xiàn)通常使用 B_TREE。B_TREE 索引加速了數(shù)據(jù)訪問,因為存儲引擎不會再去掃描整張表得到需要的數(shù)據(jù);相反,它從根節(jié)點開始,根節(jié)點保存了子節(jié)點的指針,存儲引擎會根據(jù)指針快速尋找數(shù)據(jù)。

優(yōu)化查詢效率方案

  1. 應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索。
  2. 應(yīng)盡量避免在 where 子句中對字段進行 null 值判斷,避免使用!=或<>操作符,避免使用 or連接條件,或在 where 子句中使用參數(shù)、對字段進行表達式或函數(shù)操作,否則會導(dǎo)致全表掃描
  3. 不要在 where 子句中的“=”左邊進行函數(shù)、算術(shù)運算或其他表達式運算,否則系統(tǒng)將可能無法正確使用索引。
  4. 使用索引字段作為條件時,如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統(tǒng)使用該索引,否則該索引將不會被使用。
  5. 很多時候可考慮用 exists 代替 in。
  6. 盡量使用數(shù)字型字段。
  7. 盡可能的使用 varchar/nvarchar 代替 char/nchar。
  8. 任何地方都不要使用 select from t ,用具體的字段列表代替“”,不要返回用不到的任何字段。
  9. 盡量使用表變量來代替臨時表。
  10. 避免頻繁創(chuàng)建和刪除臨時表,以減少系統(tǒng)表資源的消耗。
  11. 盡量避免使用游標,因為游標的效率較差。
  12. 在所有的存儲過程和觸發(fā)器的開始處設(shè)置 SET NOCOUNT ON ,在結(jié)束時設(shè)置 SET NOCOUNT OFF。
  13. 盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。
  14. 盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理。

Mysql 集群的優(yōu)缺點

優(yōu)點:

  • 99.999%的高可用性
  • 快速的自動失效切換
  • 靈活的分布式體系結(jié)構(gòu),沒有單點故障
  • 高吞吐量和低延遲
  • 可擴展性強,支持在線擴容

缺點

  • 存在很多限制,比如:不支持外鍵
  • 部署、管理、配置很復(fù)雜
  • 占用磁盤空間大、內(nèi)存大
  • 備份和恢復(fù)不方便
  • 重啟的時候,數(shù)據(jù)節(jié)點將數(shù)據(jù) load 到內(nèi)存需要很長的時間

Mysql 引擎,各引擎之間區(qū)別:

主要 MyISAM 與 InnoDB 兩個引擎,其主要區(qū)別如下:

  • InnoDB 支持事務(wù),MyISAM 不支持,這一點是非常之重要。事務(wù)是一種高級的處理方式,如在一
    些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM 就不可以了;
  • MyISAM 適合查詢以及插入為主的應(yīng)用,InnoDB 適合頻繁修改以及涉及到安全性較高的應(yīng)用;
  • InnoDB 支持外鍵,MyISAM 不支持;
  • MyISAM 是默認引擎,InnoDB 需要指定;
  • InnoDB 不支持 FULLTEXT 類型的索引;
  • InnoDB 中不保存表的行數(shù),如 select count() from table 時,InnoDB;需要掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數(shù)即可。注意的是,當 count()語句包含where 條件時 MyISAM 也需要掃描整個表;
  • 對于自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM 表中可以和其他字段一起建立聯(lián)合索引;清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;
  • InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

數(shù)據(jù)庫的優(yōu)化

1.優(yōu)化索引、SQL 語句、分析慢查詢;
2.設(shè)計表的時候嚴格根據(jù)數(shù)據(jù)庫的設(shè)計范式來設(shè)計數(shù)據(jù)庫;
3.使用緩存,把經(jīng)常訪問到的數(shù)據(jù)而且不需要經(jīng)常變化的數(shù)據(jù)放在緩存中,能節(jié)約磁盤 IO
4.優(yōu)化硬件;采用 SSD,使用磁盤隊列技術(shù)(RAID0,RAID1,RDID5)等
5.采用 MySQL 內(nèi)部自帶的表分區(qū)技術(shù),把數(shù)據(jù)分層不同的文件,能夠提高磁盤的讀取效率;
6.垂直分表;把一些不經(jīng)常讀的數(shù)據(jù)放在一張表里,節(jié)約磁盤 I/O;
7.主從分離讀寫;采用主從復(fù)制把數(shù)據(jù)庫的讀操作和寫入操作分離開來;
8.分庫分表分機器(數(shù)據(jù)量特別大),主要的的原理就是數(shù)據(jù)路由;
9.選擇合適的表引擎,參數(shù)上的優(yōu)化
10.進行架構(gòu)級別的緩存,靜態(tài)化和分布式;
11.不采用全文索引;
12.采用更快的存儲方式,例如 NoSQL 存儲經(jīng)常訪問的數(shù)據(jù)。

Mysql 數(shù)據(jù)庫分區(qū)、分表

分表可以通過三種方式:Mysql 集群、自定義規(guī)則和 merge 存儲引擎。
分區(qū)有四類:

  • RANGE 分區(qū):基于屬于一個給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
  • LIST 分區(qū):類似于按 RANGE 分區(qū),區(qū)別在于 LIST 分區(qū)是基于列值匹配一個離散值集合中的某個值來進行選擇。
  • HASH 分區(qū):基于用戶定義的表達式的返回值來進行選擇的分區(qū),該表達式使用將要插入到表中的這些行的列值進行計算。這個函數(shù)可以包含 MySQL 中有效的、產(chǎn)生非負整數(shù)值的任何表達式。
  • KEY 分區(qū):類似于按 HASH 分區(qū),區(qū)別在于 KEY 分區(qū)只支持計算一列或多列,且 MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。

Sql 注入是產(chǎn)生原因及防止措施?

程序開發(fā)過程中不注意規(guī)范書寫 sql 語句和對特殊字符進行過濾,導(dǎo)致客戶端可以通過全局變量POST 和 GET 提交一些 sql 語句正常執(zhí)行。產(chǎn)生 Sql 注入。下面是防止辦法:

  1. 過濾掉一些常見的數(shù)據(jù)庫操作關(guān)鍵字,或者通過系統(tǒng)函數(shù)來進行過濾。
  2. 在 PHP 配置文件中將 Register_globals=off;設(shè)置為關(guān)閉狀態(tài)
  3. SQL 語句書寫的時候盡量不要省略小引號(tab 鍵上面那個)和單引號
  4. 提高數(shù)據(jù)庫命名技巧,對于一些重要的字段根據(jù)程序的特點命名,取不易被猜到的
  5. 對于常用的方法加以封裝,避免直接暴漏 SQL 語句
  6. 開啟 PHP 安全模式:Safe_mode=on;
  7. 打開 magic_quotes_gpc 來防止 SQL 注入
  8. 控制錯誤信息:關(guān)閉錯誤提示信息,將錯誤信息寫到系統(tǒng)日志。
  9. 使用 mysqli 或 pdo 預(yù)處理。

非關(guān)系型數(shù)據(jù)庫與關(guān)系型數(shù)據(jù)庫區(qū)別

  1. SQL 數(shù)據(jù)存在特定結(jié)構(gòu)的表中;而 NoSQL 則更加靈活和可擴展,存儲方式可以省是 JSON 文檔、哈希表或者其他方式。
  2. 在 SQL 中,必須定義好表和字段結(jié)構(gòu)后才能添加數(shù)據(jù),例如定義表的主鍵(primary key),索引(index),觸發(fā)器(trigger),存儲過程(stored procedure)等。表結(jié)構(gòu)可以在被定義之后更新,但是如果有比較大的結(jié)構(gòu)變更的話就會變得比較復(fù)雜。在 NoSQL 中,數(shù)據(jù)可以在任何時候任何地方添加,不需要先定義表。
  3. SQL 中如果需要增加外部關(guān)聯(lián)數(shù)據(jù)的話,規(guī)范化做法是在原表中增加一個外鍵,關(guān)聯(lián)外部數(shù)據(jù)表。而在 NoSQL 中除了這種規(guī)范化的外部數(shù)據(jù)表做法以外,我們還能用如下的非規(guī)范化方式把外部數(shù)據(jù)直接放到原數(shù)據(jù)集中,以提高查詢效率。缺點也比較明顯,更新審核人數(shù)據(jù)的時候?qū)容^麻煩。
  4. SQL 中可以使用 JOIN 表鏈接方式將多個關(guān)系數(shù)據(jù)表中的數(shù)據(jù)用一條簡單的查詢語句查詢出來。NoSQL 暫未提供類似 JOIN 的查詢方式對多個數(shù)據(jù)集中的數(shù)據(jù)做查詢。所以大部分 NoSQL 使用非規(guī)范化的數(shù)據(jù)存儲方式存儲數(shù)據(jù)。
  5. SQL 中不允許刪除已經(jīng)被使用的外部數(shù)據(jù),而 NoSQL 中則沒有這種強耦合的概念,可以隨時刪除任何數(shù)據(jù)。
  6. SQL 中如果多張表數(shù)據(jù)需要同批次被更新,即如果其中一張表更新失敗的話其他表也不能更新成功。這種場景可以通過事務(wù)來控制,可以在所有命令完成后再統(tǒng)一提交事務(wù)。而 NoSQL 中沒有事務(wù)這個概念,每一個數(shù)據(jù)集的操作都是原子級的。
  7. 在相同水平的系統(tǒng)設(shè)計的前提下,因為 NoSQL 中省略了 JOIN 查詢的消耗,故理論上性能上是優(yōu)于 SQL 的。

數(shù)據(jù)庫負載均衡

負載均衡集群是由一組相互獨立的計算機系統(tǒng)構(gòu)成,通過常規(guī)網(wǎng)絡(luò)或?qū)S镁W(wǎng)絡(luò)進行連接,由路由器銜接在一起,各節(jié)點相互協(xié)作、共同負載、均衡壓力,對客戶端來說,整個群集可以視為一臺具有超高性能的獨立服務(wù)器。

實現(xiàn)原理
實現(xiàn)數(shù)據(jù)庫的負載均衡技術(shù),首先要有一個可以控制連接數(shù)據(jù)庫的控制端。在這里,它截斷了數(shù)據(jù)庫和程序的直接連接,由所有的程序來訪問這個中間層,然后再由中間層來訪問數(shù)據(jù)庫。這樣,我們就可以具體控制訪問某個數(shù)據(jù)庫了,然后還可以根據(jù)數(shù)據(jù)庫的當前負載采取有效的均衡策略,來調(diào)整每次連接到哪個數(shù)據(jù)庫。
實現(xiàn)多據(jù)庫數(shù)據(jù)同步
對于負載均衡,最重要的就是所有服務(wù)器的數(shù)據(jù)都是實時同步的。這是一個集群所必需的,因為,如果數(shù)不據(jù)實時、不同步,那么用戶從一臺服務(wù)器讀出的數(shù)據(jù),就有別于從另一臺服務(wù)器讀出的數(shù)據(jù),這是不能允許的。所以必須實現(xiàn)數(shù)據(jù)庫的數(shù)據(jù)同步。這樣,在查詢的時候就可以有多個資源,實現(xiàn)均衡。比較常用的方法是 Moebius for SQL Server 集群,Moebius for SQL Server 集群采用將核心程序駐留在每個機器的數(shù)據(jù)庫中的辦法,這個核心程序稱為 Moebius for SQL Server中間件,主要作用是監(jiān)測數(shù)據(jù)庫內(nèi)數(shù)據(jù)的變化并將變化的數(shù)據(jù)同步到其他數(shù)據(jù)庫中。數(shù)據(jù)同步完成后客戶端才會得到響應(yīng),同步過程是并發(fā)完成的,所以同步到多個數(shù)據(jù)庫和同步到一個數(shù)據(jù)庫的時間基本相等;另外同步的過程是在事務(wù)的環(huán)境下完成的,保證了多份數(shù)據(jù)在任何時刻數(shù)據(jù)的一致性。正因為 Moebius 中間件宿主在數(shù)據(jù)庫中的創(chuàng)新,讓中間件不但能知道數(shù)據(jù)的變化,而且知道引起數(shù)據(jù)變化的 SQL 語句,根據(jù) SQL 語句的類型智能的采取不同的數(shù)據(jù)同步的策略以保證數(shù)據(jù)同步成本的最小化。
數(shù)據(jù)條數(shù)很少,數(shù)據(jù)內(nèi)容也不大,則直接同步數(shù)據(jù)。數(shù)據(jù)條數(shù)很少,但是里面包含大數(shù)據(jù)類型,比如文本,二進制數(shù)據(jù)等,則先對數(shù)據(jù)進行壓縮然后再同步,從而減少網(wǎng)絡(luò)帶寬的占用和傳輸所用的時間。
數(shù)據(jù)條數(shù)很多,此時中間件會拿到造成數(shù)據(jù)變化的 SQL 語句, 然后對 SQL 語句進行解析,分析其執(zhí)行計劃和執(zhí)行成本,并選擇是同步數(shù)據(jù)還是同步 SQL 語句到其他的數(shù)據(jù)庫中。此種情況應(yīng)用在對表結(jié)構(gòu)進行調(diào)整或者批量更改數(shù)據(jù)的時候非常有用。
優(yōu)點

1.擴展性強:當系統(tǒng)要更高數(shù)據(jù)庫處理速度時,只要簡單地增加數(shù)據(jù)庫服務(wù)器就 可以得到擴展。

  1. 可維護性:當某節(jié)點發(fā)生故障時,系統(tǒng)會自動檢測故障并轉(zhuǎn)移故障節(jié)點的應(yīng)用,保證數(shù)據(jù)庫的持續(xù)工作。
  2. 安全性:因為數(shù)據(jù)會同步的多臺服務(wù)器上,可以實現(xiàn)數(shù)據(jù)集的冗余,通過多份數(shù)據(jù)來保證安全性。另外它成功地將數(shù)據(jù)庫放到了內(nèi)網(wǎng)之中,更好地保護了數(shù)據(jù)庫的安全性。
    4.易用性:對應(yīng)用來說完全透明,集群暴露出來的就是一個 IP

缺點

1.不能夠按照 Web 服務(wù)器的處理能力分配負載。

  1. 負載均衡器(控制端)故障,會導(dǎo)致整個數(shù)據(jù)庫系統(tǒng)癱瘓。

數(shù)據(jù)庫的設(shè)計三范式

第一范式:數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項,即列不可拆分。
第二范式:建立在第一范式的基礎(chǔ)上,要求數(shù)據(jù)庫表中的每個實例或記錄必須是可以唯一被區(qū)分的,即唯一標識
第三范式:建立在第二范式的基礎(chǔ)上,任何非主屬性不依賴與其他非主屬性,即引用主鍵

存儲過程和函數(shù)的區(qū)別

相同點:

存儲過程和函數(shù)都是為了可重復(fù)的執(zhí)行操作數(shù)據(jù)庫的 sql 語句的集合。

  • 存儲過程和函數(shù)都是一次編譯,就會被緩存起來,下次使用就直接命中已經(jīng)編譯好的 sql 語句,不需要重復(fù)使用。減少網(wǎng)絡(luò)交互,減少網(wǎng)絡(luò)訪問流量。

不同點

標識符不同,函數(shù)的標識符是 function,存儲過程是 proceduce。

  • 函數(shù)中有返回值,且必須有返回值,而過程沒有返回值,但是可以通過設(shè)置參數(shù)類型(in,out)來實現(xiàn)多個參數(shù)或者返回值。
  • 存儲函數(shù)使用 select 調(diào)用,存儲過程需要使用 call 調(diào)用。
  • select 語句可以在存儲過程中調(diào)用,但是除了 select..into 之外的 select 語句都不能在函數(shù)中使用。
  • 通過 in out 參數(shù),過程相關(guān)函數(shù)更加靈活,可以返回多個結(jié)果。

Mysql 日志

錯誤日志:記錄啟動,運行或者停止 mysql 時出現(xiàn)的問題;
通用日志:記錄建立的客戶端連接和執(zhí)行的語句;
二進制日志:記錄所有更改數(shù)據(jù)的語句;
慢查詢?nèi)罩荆河涗浰袌?zhí)行時間超過 long_query_time 秒的查詢或者不適用索引的查詢)
通過使用--slow_query_log[={0|1}]選項來啟用慢查詢?nèi)罩?,所有?zhí)行時間超多 long_query_time 的語句都會被記錄。

Redis 集群搭建

這篇文章寫的不錯,參考此博客
https://blog.csdn.net/yfkiss/article/details/38944179

Redis 的并發(fā)競爭問題解決方案

1.可以使用獨占鎖的方式,類似操作系統(tǒng)的 mutex 機制,不過實現(xiàn)相對復(fù)雜,成本較高。
2.使用樂觀鎖的方式進行解決(成本較低,非阻塞,性能較高)

  • 本質(zhì)上是假設(shè)不會進行沖突,使用 redis 的命令 watch 進行構(gòu)造條件

MySQL 和 Redis 高可用性體現(xiàn)

1.MySQL Replication 是 MySQL 官方提供的主從同步方案,用于將一個 MySQL 實例的數(shù)據(jù),同步到另一個實例中。Replication 為保證 數(shù)據(jù)安全做了重要的保證,也是現(xiàn)在運用最廣的MySQL容災(zāi)方案。Replication用兩個或以上的實例搭建了MySQL主從復(fù)制集群,提供 單點寫入,多點讀取的服務(wù),實現(xiàn)了讀的 scale out。
2.Sentinel 是 Redis 官方為集群提供的高可用解決方案。在實際 項目中可以使用 sentinel去做 Redis 自動故障轉(zhuǎn)移,減少人工介入的工作量。另外 sentinel 也給客戶端提供了監(jiān)控消息的通知,這樣客戶端就可根據(jù)消息類型去判斷服務(wù)器的狀態(tài),去做對應(yīng)的適配操作。
下面是 Sentinel 主要功能列表:

  • Monitoring:Sentinel 持續(xù)檢查集群中的 master、slave 狀態(tài),判斷是否存活。
  • Notification:在發(fā)現(xiàn)某個 Redis 實例死的情況下,Sentinel 能通過 API 通知系統(tǒng)管理員或其他程序腳本。
  • Automatic failover:如果一個 master 掛掉后,sentinel 立馬啟動故障轉(zhuǎn)移,把某個 slave 提升為 master。其他的 slave 重新配置指向新 master。
  • Configuration provider:對于客戶端來說 sentinel 通知是有效可信賴的。客戶端會連接sentinel 去請求當前 master 的地址,一旦發(fā)生故障 sentinel 會提供新地址給客戶端。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、 left join, right join, inner join區(qū)別? left join(左聯(lián)接) 返回...
    小拳頭醬閱讀 853評論 0 3
  • 斷言:一個斷言就是數(shù)據(jù)庫需要時刻滿足的某一條件。 授權(quán):對不同用戶在數(shù)據(jù)庫中的不同數(shù)據(jù)值上允許不同的訪問類型。這些...
    取名廢同學(xué)閱讀 945評論 0 0
  • 面試中吃了幾次數(shù)據(jù)庫上面的虧,做個總結(jié)(關(guān)系型數(shù)據(jù)庫) 數(shù)據(jù)庫知識點 感覺面試的必問的一塊內(nèi)容了,但一開始重新看數(shù)...
    楚_kw閱讀 566評論 0 2
  • 1.MySQL 和 MongoDB 的區(qū)別有哪些?如何選擇? MySQL是關(guān)系型數(shù)據(jù)庫。 優(yōu)勢: 在不同的引擎上有...
    值得_e36c閱讀 644評論 0 0
  • 新年馬上來了,南京也開始舉行燈會。 青奧燈會賞燈攻略在這,點擊即可。 2019青奧藝術(shù)燈會來啦!你想知道的都在這里...
    李博愛閱讀 494評論 1 5

友情鏈接更多精彩內(nèi)容