最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 索引設計的全過程(原理、原則與實戰(zhàn)案例)

 更新時間:2025年05月30日 10:09:24   作者:碼熔burning  
索引設計是一個持續(xù)優(yōu)化、不斷學習的過程,沒有一勞永逸的方案,只有最適合當前業(yè)務負載的索引,本文給大家介紹MySQL索引設計的全過程(原理、原則與實戰(zhàn)案例),感興趣的朋友一起看看吧

前言

你好呀,數(shù)據(jù)庫性能優(yōu)化的同道們!?? 索引是提升數(shù)據(jù)庫查詢性能的“核武器”,但正如“能力越大,責任越大”一樣,索引用不好,也可能帶來負面影響(比如降低寫性能,占用磁盤空間)。所以,如何設計合適的索引,是每個開發(fā)者和 DBA 必備的技能。

索引設計沒有放之四海而皆準的公式,它高度依賴于你的具體的業(yè)務場景和查詢負載。但幸運的是,有一些通用的原則和方法論,可以指導我們做出更明智的設計決策。

第一章:索引設計的基礎原則 (知其然,更要知其所以然)

就像蓋房子得先打地基,設計索引也得先掌握基礎原則。

1. 索引不是越多越好,更不是全表索引!

  • 成本: 每個索引都需要占用磁盤空間。更重要的是,INSERT, UPDATE, DELETE 操作時,數(shù)據(jù)庫不僅要修改數(shù)據(jù)行,還要同步修改所有相關的索引。索引越多,寫操作的開銷越大,可能成為新的瓶頸。
  • 優(yōu)化器負擔: 索引越多,查詢優(yōu)化器選擇執(zhí)行計劃時需要考慮的可能性就越多,反而可能增加優(yōu)化器的決策時間,甚至選錯索引。

原則: 只為真正能提升性能、且頻繁執(zhí)行的查詢創(chuàng)建索引。對寫操作頻繁的表,索引尤其要謹慎。

2. 索引應建在 WHERE, JOIN, ORDER BY, GROUP BY 子句中引用的列上。

這是索引最主要的受益場景。

  • WHERE:用于快速過濾數(shù)據(jù)行。這是最重要的索引候選區(qū)域。
  • JOIN: 用于快速找到關聯(lián)表中的匹配行。
  • JOIN 條件中的列在兩邊表中都應該考慮建索引。
  • ORDER BY / GROUP BY:用于避免昂貴的排序(Filesort)和臨時表(Using Temporary)操作。

原則: 優(yōu)先考慮在這些子句中頻繁出現(xiàn)的列上建索引。

3. 考慮列的“選擇性”(Cardinality,區(qū)分度)。

選擇性是指列中不重復值的比例。計算公式:COUNT(DISTINCT column) / COUNT(*)。選擇性越高,意味著該列的值越多樣,通過該列進行條件過濾時,能越快地排除掉大量不符合條件的行。

  • 高選擇性: 主鍵、唯一鍵(如用戶 ID, 訂單號, 郵箱, 身份證號等)通常選擇性很高,非常適合作為索引。
  • 低選擇性: 性別 (男/女/未知)、布爾狀態(tài) (0/1) 等選擇性很低。單獨對這類列建索引意義不大,因為查某個值可能還是需要掃描表中近一半的數(shù)據(jù)。

原則: 高選擇性的列是獨立的索引或聯(lián)合索引前綴的優(yōu)先選擇。低選擇性的列單獨建索引效果有限,但可以在聯(lián)合索引中與高選擇性列組合使用,或者用于覆蓋索引。

4. 謹慎選擇數(shù)據(jù)類型。

  • 越小越好: 索引存儲的是列值,值越小,索引占用的空間越小,每個索引頁能存儲的索引條目越多,I/O效率越高。考慮使用 INT 而不是 BIGINT (如果數(shù)值范圍允許),使用 VARCHAR 時盡量預估合理長度。
  • 固定長度更好: INT, CHAR 等固定長度類型比 VARCHAR 等變長類型更容易索引和查找。
  • 避免在索引中使用過長的字符串。 如果必須索引長字符串,可以考慮使用前綴索引(VARCHAR(255), 索引時只取前 N 個字符,如 INDEX (column(10)))。但要注意前綴索引的選擇性損失。

原則: 在滿足業(yè)務需求的前提下,選擇占用空間小、固定長度的數(shù)據(jù)類型作為索引列。

5. 理解并善用聯(lián)合索引 (Composite Index)。

當查詢條件或排序/分組涉及多個列時,聯(lián)合索引往往比多個單列索引更有效。

  • 最左前綴原則: 這是聯(lián)合索引最重要的原理。對于聯(lián)合索引 (colA, colB, colC),它可以被用于查詢 colA, (colA, colB), (colA, colB, colC) 作為查詢條件或排序/分組前綴的場景。但不能用于只查 colB, colC, (colB, colC) 等不包含最左前綴列的場景。
  • 列的順序: 聯(lián)合索引中列的順序至關重要!通常將最常用在 WHERE 子句中進行等值過濾、或選擇性最高的列放在最前面。然后根據(jù) WHERE 的范圍過濾、GROUP BY、ORDER BY 的需求依次排列。

原則: 分析查詢模式,如果多個列經(jīng)常一起出現(xiàn)在 WHERE, JOIN, ORDER BY, GROUP BY 中,考慮建立聯(lián)合索引。根據(jù)最左前綴原則精心設計列的順序。

6. 追求覆蓋索引 (Covering Index)。

如果一個索引包含了查詢所需的所有列(SELECT 列表中的列和 WHERE 子句中的列),MySQL 可以直接從索引中返回數(shù)據(jù),無需回表查詢完整的行。這效率極高!EXPLAINExtra 列會顯示 Using index。

原則: 對于某些性能要求極高且列數(shù)量不多的查詢,可以考慮創(chuàng)建包含所有所需列的覆蓋索引。但這會增加索引的大小和寫開銷,需要權衡。

7. 定期審查和優(yōu)化索引。

業(yè)務在發(fā)展,數(shù)據(jù)在變化,查詢模式也可能隨之改變。過去有效的索引,現(xiàn)在可能不再最優(yōu),甚至變成了累贅。

原則: 利用慢查詢日志、性能監(jiān)控工具,定期分析數(shù)據(jù)庫負載,檢查索引的使用情況(例如,通過 sys 庫或 information_schema ),刪除不再使用或效率低下的索引,為新的查詢瓶頸創(chuàng)建索引。

8. EXPLAIN是你的眼睛。

所有索引設計的猜想和優(yōu)化都需要通過 EXPLAIN 來驗證實際的執(zhí)行計劃。

原則: 設計或調整索引后,一定要使用 EXPLAIN 來查看目標查詢是否使用了預期的索引,type, key, rows, Extra 列的信息是否符合優(yōu)化目標(例如,避免 Using filesort, Using temporary, ALL, 減少 rows,出現(xiàn) Using index)。

第二章:實戰(zhàn)案例:電商訂單系統(tǒng)的索引設計

理論說了不少,現(xiàn)在咱們結合一個具體的電商訂單系統(tǒng)場景,來看看如何應用這些原則。

假設我們有以下簡化版的表結構:

-- 用戶表
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    registration_date DATE NOT NULL,
    city VARCHAR(50),
    -- ... 其他用戶信息
    INDEX idx_user_regdate (registration_date) -- 按注冊日期查找用戶
);
-- 商品表
CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(100) NOT NULL,
    category_id INT,
    price DECIMAL(10, 2),
    -- ... 其他商品信息
    INDEX idx_product_category (category_id) -- 按分類查找商品
);
-- 訂單表
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    order_time DATETIME NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    status ENUM('Pending', 'Paid', 'Shipped', 'Completed', 'Cancelled') NOT NULL,
    city VARCHAR(50), -- 收貨城市
    -- ... 其他訂單信息
    INDEX idx_order_user_time (user_id, order_time), -- 按用戶和時間查找訂單
    INDEX idx_order_time (order_time) -- 按時間范圍查找訂單
);
-- 訂單項表 (一個訂單包含多個商品)
CREATE TABLE order_items (
    order_item_id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10, 2) NOT NULL, -- 購買時的價格
    -- ... 其他訂單項信息
    INDEX idx_item_order (order_id), -- 按訂單查找訂單項
    INDEX idx_item_product (product_id) -- 按商品查找訂單項 (用于統(tǒng)計商品銷量)
);

這些表結構和索引是一些初步的設計,基于一些常見的訪問模式。現(xiàn)在,我們考慮一些具體的業(yè)務查詢場景,并優(yōu)化索引:

場景一:查詢某個用戶的訂單歷史,按時間倒序排列。

-- 業(yè)務需求:用戶查看自己的訂單列表
SELECT order_id, order_time, total_amount, status
FROM orders
WHERE user_id = 12345
ORDER BY order_time DESC;
  • 分析: WHERE 條件是 user_id 等值查詢,ORDER BYorder_time 倒序。
  • 現(xiàn)有索引: idx_order_user_time (user_id, order_time)。這個聯(lián)合索引完美匹配了 WHEREORDER BY 的需求。user_id 作為聯(lián)合索引的最左前綴用于過濾,order_time 緊隨其后用于排序。MySQL 可以利用這個索引直接按照 user_id 找到對應的訂單,并按照 order_time 的倒序讀取索引條目,避免 Filesort。
  • 優(yōu)化: 現(xiàn)有索引已經(jīng)很好。如果希望更進一步(比如查詢非常頻繁,且只需要這幾個列),可以考慮將 total_amountstatus 加入到索引中,形成覆蓋索引 (user_id, order_time, total_amount, status)。但這會增加索引大小和寫開銷。
  • EXPLAIN 驗證 EXPLAIN SELECT order_id, order_time, total_amount, status FROM orders WHERE user_id = 12345 ORDER BY order_time DESC; 應該顯示 type: ref,key: idx_order_user_time,Extra沒有 Using filesort,如果使用覆蓋索引,Extra 會顯示 Using index。

場景二:查詢某個城市最近一周已支付的訂單。

-- 業(yè)務需求:運營人員查看某個區(qū)域的近期訂單情況
SELECT order_id, user_id, order_time, total_amount
FROM orders
WHERE city = 'Beijing'
AND order_time >= '2025-04-01' -- 示例日期
AND status = 'Paid'
ORDER BY order_time DESC
LIMIT 100; -- 通常會限制結果集
  • 分析: WHERE 條件包括 city (等值), order_time (范圍), status (等值)。ORDER BYorder_time 倒序。有 LIMIT
  • 現(xiàn)有索引: idx_order_user_time (user_id, order_time) (不適用,user_id 不在 WHERE 中),idx_order_time (order_time) (可以用,但過濾性不夠)。問題: 現(xiàn)有的索引無法高效處理 citystatus 的過濾,也無法直接支持 cityorder_time 的聯(lián)合過濾和排序。很可能導致 Filesort 或全表掃描。
  • 設計新索引:
    • 考慮將 city 放在聯(lián)合索引最前面(等值過濾,區(qū)分度可能不如 user_id 但比 status 高)。
    • 然后是 order_time(范圍過濾,且用于排序)。status 是低選擇性,可以放在后面,或者如果查詢非常頻繁且需要覆蓋,可以放在最后。
    • 考慮覆蓋索引所需的列:order_id (主鍵自帶), user_id, total_amount。
    • 方案一 (核心過濾與排序): INDEX idx_order_city_time (city, order_time)。這個索引能利用 city 過濾,利用 order_time 進行范圍掃描和排序(倒序掃描)。status 的過濾需要在回表后進行,user_idtotal_amount 也需要回表獲取。
    • 方案二 (包含狀態(tài)過濾,可能伴隨 ICP): INDEX idx_order_city_time_status (city, order_time, status)。這個索引可以利用 city 過濾,order_time 范圍掃描。理論上 status 條件可以在掃描索引時下推過濾(ICP),減少回表。但 status 選擇性低,ICP 效果可能有限。
    • 方案三 (覆蓋索引): INDEX idx_order_city_time_status_cover (city, order_time, status, user_id, total_amount)。這能避免回表,性能可能最高,但索引體積大,寫開銷高。
  • 選擇: 方案一通常是一個不錯的折衷,它解決了主要的 city 過濾和 order_time 排序問題。方案二可以嘗試驗證 ICP 的效果。方案三用于極致優(yōu)化,但要評估寫開銷。對于這個場景,先嘗試方案一或二,用 EXPLAIN 和實際數(shù)據(jù)測試,如果性能瓶頸仍在,再考慮方案三。
  • EXPLAIN 驗證: 使用 EXPLAIN 查看不同索引方案的執(zhí)行計劃,對比 type, key, rows, Extra (特別是看有沒有 Using filesort, Using index condition, Using index)。
-- 示例新索引
CREATE INDEX idx_order_city_time ON orders (city, order_time);
-- 或者考慮包含 status 的索引
CREATE INDEX idx_order_city_time_status ON orders (city, order_time, status);

場景三:統(tǒng)計每個商品在一個月內的總銷量。

-- 業(yè)務需求:商品銷售報表
SELECT oi.product_id, p.product_name, SUM(oi.quantity) as total_sold
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
JOIN orders o ON oi.order_id = o.order_id -- 需要根據(jù)訂單時間過濾
WHERE o.order_time >= '2025-04-01' AND o.order_time < '2025-05-01'
GROUP BY oi.product_id, p.product_name
ORDER BY total_sold DESC; -- 按銷量排序(注意:聚合函數(shù)排序通常需要 Filesort)
  • 分析: 涉及 order_items, products, orders 三表 JOIN。過濾條件在 orders.order_time (范圍)。GROUP BYoi.product_idp.product_name。ORDER BY 是聚合函數(shù)結果。
  • 現(xiàn)有索引: orders 表有 idx_order_time (order_time) (可以用于時間范圍過濾),order_items 表有 idx_item_order (order_id)idx_item_product (product_id),products 表有 idx_product_category (category_id) (與此查詢無關)。
  • 問題:
    • orders 表的時間過濾可以使用 idx_order_time
    • order_itemsproducts 的 JOIN 條件 oi.product_id = p.product_id 在兩表都有索引 (idx_item_product 和主鍵),JOIN 效率尚可。
    • order_itemsorders 的 JOIN 條件 oi.order_id = o.order_idorder_items 有索引 (idx_item_order),orders 的主鍵是 order_id,JOIN 效率也尚可。
    • 關鍵在于 GROUP BY oi.product_id, p.product_name。 product_nameproducts 表,product_idorder_items 表??绫淼?GROUP BY 通常難以直接利用一個索引進行分組。聚合結果的排序 (ORDER BY total_sold DESC) 幾乎肯定需要 Filesort。
  • 設計新索引:
    • 首先確保 JOIN 字段有索引,這已經(jīng)有了 (order_id, product_id)。
    • 考慮 orders 表的時間過濾:idx_order_time (order_time) 是合適的。
    • 優(yōu)化 GROUP BY: 如果 product_idorder_items 中非常頻繁地用于分組,idx_item_product (product_id) 可以幫助按 product_id 掃描和分組,但需要結合 product_name。由于 product_name 來自 products 表,MySQL 需要在 JOIN 后進行分組。
    • 對于這種涉及跨表 GROUP BY 和聚合結果排序的復雜報表查詢,通常難以完全避免 Using temporaryUsing filesort。優(yōu)化的重點在于確保前期的過濾和 JOIN 走索引,減少需要分組和排序的數(shù)據(jù)量。
  • 可能的索引優(yōu)化點:
    • 確保 orders.order_time 有效索引,優(yōu)化時間范圍過濾。
    • 確保 JOIN 字段 (orders.order_id, order_items.order_id, order_items.product_id, products.product_id) 有效索引。
    • 現(xiàn)有索引已經(jīng)覆蓋了。
    • 如果 product_id 的分組是瓶頸,idx_item_product (product_id) 可以提供幫助。
  • EXPLAIN 驗證: 運行 EXPLAIN 查看 JOIN 順序、類型 (type)、使用的索引 (key)。重點關注 Extra 列是否有 Using temporaryUsing filesort。在這個場景下,它們很可能會出現(xiàn),但如果前期的 JOIN 和過濾優(yōu)化得當,F(xiàn)ilesort 和臨時表處理的數(shù)據(jù)量會大大減少。
-- 確保 JOIN 字段有索引 (已存在)
-- 確保 orders.order_time 有索引 (已存在)

更多場景和索引思考:

  • 按商品分類和價格范圍查詢商品: WHERE category_id = ... AND price BETWEEN ... -> INDEX (category_id, price)。
  • 按訂單狀態(tài)統(tǒng)計數(shù)量: WHERE status = '...'。Status 選擇性低,單獨索引意義不大。但如果經(jīng)常和時間一起查 WHERE status = '...' AND order_time >= ...,可以考慮 INDEX (status, order_time),status在前用于等值過濾,雖然過濾性弱,但可以利用 order_time 進行范圍掃描和排序。或者考慮 INDEX (order_time, status),優(yōu)先利用時間范圍掃描,然后 status 可以在索引掃描過程中進行過濾(ICP)。哪個更好取決于實際數(shù)據(jù)分布和查詢習慣,需要測試。
  • 索引覆蓋的評估: 如果某個查詢 SELECT colA, colB FROM table WHERE colC = ... 頻繁執(zhí)行,且只需要 colA, colB, colC 這三列,可以考慮 INDEX (colC, colA, colB) 來實現(xiàn)覆蓋索引。

第三章:索引設計的實踐流程總結

結合上面的原則和實戰(zhàn),我們可以總結一個索引設計的實踐流程:

  • 分析業(yè)務需求和查詢負載: 收集慢查詢日志,了解哪些查詢是瓶頸,它們涉及哪些表、哪些列,查詢頻率如何。
  • 分析查詢語句: 仔細查看慢查詢的 WHERE, JOIN, ORDER BY, GROUP BY, SELECT 子句。
  • 識別索引候選列: 找出最可能需要索引的列。
  • 評估列的特點: 考慮列的選擇性、數(shù)據(jù)類型、是否經(jīng)常更新。
  • 設計索引方案:
    • 考慮單列索引、聯(lián)合索引。
    • 設計聯(lián)合索引時,根據(jù)最左前綴原則和查詢模式確定列的順序。
    • 考慮是否需要創(chuàng)建覆蓋索引。
    • 權衡讀(查詢)性能和寫(寫)性能的開銷。
  • 創(chuàng)建候選索引: 在測試環(huán)境創(chuàng)建你設計的索引。
  • 使EXPLAIN 驗證 對目標慢查詢運行 EXPLAIN,查看執(zhí)行計劃是否按照預期走了索引,是否有 Using filesort, Using temporary 等不良信息。對比優(yōu)化前后的 EXPLAIN 結果。
  • 性能測試: 在接近生產(chǎn)環(huán)境的數(shù)據(jù)量和負載下進行實際的性能測試,對比查詢響應時間。
  • 部署到生產(chǎn)環(huán)境: 如果測試效果良好,謹慎地將索引變更部署到生產(chǎn)環(huán)境。
  • 監(jiān)控和審查: 持續(xù)監(jiān)控數(shù)據(jù)庫性能和索引使用情況,定期回顧和調整索引策略。

結語

索引設計是一個持續(xù)優(yōu)化、不斷學習的過程。沒有一勞永逸的方案,只有最適合當前業(yè)務負載的索引。掌握索引的基礎原理,理解 WHERE, JOIN, ORDER BY, GROUP BY 如何利用索引,學會分析 EXPLAIN 輸出,并結合具體的業(yè)務場景進行實踐,你就能設計出高效的索引,讓你的數(shù)據(jù)庫查詢飛沙走石!??

到此這篇關于MySQL 索引設計的全過程(原理、原則與實戰(zhàn)案例)的文章就介紹到這了,更多相關mysql索引設計內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • CentOS安裝mysql5.7 及簡單配置教程詳解

    CentOS安裝mysql5.7 及簡單配置教程詳解

    這篇文章主要介紹了CentOS安裝mysql5.7 及簡單配置教程詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • mysql獲取字符串長度函數(shù)(CHAR_LENGTH)

    mysql獲取字符串長度函數(shù)(CHAR_LENGTH)

    本文介紹一下關于mysql獲取字符串長度的方法,希望此教程對各位同學會有所幫助哦。
    2013-11-11
  • SQL實現(xiàn)LeetCode(176.第二高薪水)

    SQL實現(xiàn)LeetCode(176.第二高薪水)

    這篇文章主要介紹了SQL實現(xiàn)LeetCode(176.第二高薪水),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • mysql 讀寫分離(基礎篇)

    mysql 讀寫分離(基礎篇)

    MySQL Proxy最強大的一項功能是實現(xiàn)“讀寫分離(Read/Write Splitting)”。
    2009-04-04
  • Mac下mysql 5.7.17 安裝配置方法圖文教程

    Mac下mysql 5.7.17 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.17 源碼編譯安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL 正則表達式用法、模式和注意事項詳解

    MySQL 正則表達式用法、模式和注意事項詳解

    MySQL正則表達式通過REGEXP/RLIKE操作符實現(xiàn)模式匹配,支持元字符、字符類、量詞等基本功能,8.0+版本新增REGEXP_LIKE等函數(shù),提供更強大的文本處理能力,使用時需注意大小寫、性能及版本兼容性,本文介紹MySQL 正則表達式詳細說明,感興趣的朋友一起看看吧
    2025-08-08
  • MySQL 字符類型大小寫敏感

    MySQL 字符類型大小寫敏感

    這篇文章主要介紹了MySQL 字符類型大小寫敏感的相關資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-12-12
  • 解決MYSQL連接端口被占引入文件路徑錯誤的問題

    解決MYSQL連接端口被占引入文件路徑錯誤的問題

    下面小編就為大家?guī)硪黄鉀QMYSQL連接端口被占引入文件路徑錯誤的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • MySQL修改my.cnf配置不生效的解決方法

    MySQL修改my.cnf配置不生效的解決方法

    這篇文章主要介紹了MySQL修改my.cnf配置不生效的解決方法,簡單分析了配置文件的執(zhí)行順序與原理并提出解決方法,需要的朋友可以參考下
    2016-04-04
  • MySQL分區(qū)之LIST分區(qū)詳解

    MySQL分區(qū)之LIST分區(qū)詳解

    mysql分區(qū)之LIST分區(qū)講解?MySQL中的LIST分區(qū)在很多方面類似于RANGE分區(qū),下面這篇文章主要給大家介紹了關于MySQL分區(qū)之LIST分區(qū)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04

最新評論

岢岚县| 湖口县| 滨州市| 平远县| 长沙市| 望江县| 巢湖市| 乌兰浩特市| 天镇县| 台北县| 晋宁县| 黄冈市| 嘉荫县| 灵台县| 石泉县| 加查县| 靖西县| 望奎县| 雷波县| 宁安市| 清镇市| 大洼县| 兴安县| 衡水市| 茂名市| 丰台区| 井研县| 鹿邑县| 德钦县| 西安市| 石首市| 丘北县| 霍山县| 鲜城| 南城县| 桦南县| 莒南县| 青海省| 南康市| 平江县| 云安县|