【问题标题】:Slow count query (mariaDB)慢计数查询(mariaDB)
【发布时间】:2021-12-16 01:23:36
【问题描述】:

我的查询速度有问题。简单的mysql查询,但是当我有很多记录(当前> 1 000 000)时,性能真的很慢。问题与此类似,但找不到解决方案。解释说 MySQL 正在使用: 使用 where;使用索引。 有没有人有任何建议来加快它? 慢查询:

select sql_no_cache
    count(distinct(`books`.`id`)) as `count`
from `books`
left join `books_genres` use index(categorie_id) on `books_genres`.`book_id` = `books`.`id`
where 1  and `books_genres`.`genre_id` in(307,380,385,384,1359,381,390,397,394,949,1390,1391,403,401,1332,393,398,1374,1397,402,984,1025,841,1027,359,577,365,1021,1023,360,368,369,370,942,1061,1348,1376,437,737,1137,1354,1384,1385,1115,1113,1114,1143,1363,593,581,583,567,978,973,576,677,825,595,826,1043,827,1077,323,324,1361,1362,1360,407,610,611,1179,608,336,831,1042,520,1079,1078,1081,352,1349,388,727,728,729,325,330,1099,616,320,1375,1138,1388,1119,1141,1140,1328,1136,1044,1103,1074,1150,1322) and `books`.`is_status` = 'active' and `books`.`master_book` = 'true' 

结果:

+--------+
| count  |
+--------+
| 402545 |
+--------+
1 row in set (2.64 sec)

解释:

+------+-------------+--------------+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+---------+--------------------------------+---------+--------------------------+
| id   | select_type | table        | type   | possible_keys                                                                                                                                                                                                              | key          | key_len | ref                            | rows    | Extra                    |
+------+-------------+--------------+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+---------+--------------------------------+---------+--------------------------+
|    1 | SIMPLE      | books_genres | index  | categorie_id                                                                                                                                                                                                               | categorie_id | 4       | NULL                           | 1866077 | Using where; Using index |
|    1 | SIMPLE      | books        | eq_ref | PRIMARY,is_status,master_book,is_status_master_book,is_status_master_book_indexed,is_status_donor_no_ru_master_book,is_status_indexed,books_idx_is_stat_master_livelib_id,master_book_is_status,is_status_master_book_year | PRIMARY      | 4       | base.books_genres.book_id |       1 | Using where              |
+------+-------------+--------------+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+---------+--------------------------------+---------+--------------------------+
2 rows in set (0.10 sec)

我的桌子:

CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `donor` enum('default','ihavebook','flibusta','litres','book24','labirint','livelib') NOT NULL DEFAULT 'default' COMMENT 'Донор',
  `donor_id` varchar(200) DEFAULT NULL COMMENT 'ID у донора',
  `name` varchar(256) DEFAULT NULL COMMENT 'Название',
  `name_int` text COMMENT 'Оригинальное название',
  `name_alt` text COMMENT 'Альтернативные названия',
  `year` int(11) DEFAULT NULL COMMENT 'Дата выхода',
  `poster` varchar(256) DEFAULT NULL COMMENT 'Путь к изображению',
  `description` text COMMENT 'Описание',
  `rating` double(4,2) NOT NULL DEFAULT '0.00' COMMENT 'Рейтинг',
  `rating_count` int(11) NOT NULL DEFAULT '0' COMMENT 'Сколько проголосовали',
  `view_count` int(11) NOT NULL DEFAULT '0' COMMENT 'Количество просмотров',
  `allowed_fragment` enum('5','10','15','20','30','40','50','60','70') DEFAULT NULL COMMENT 'Разрешенный фрагмент правообладателем (если is_toread = false)',
  `is_status` enum('active','parser','incorrect','extremist','delete','fulldeteled') NOT NULL DEFAULT 'active' COMMENT 'Статус книги',
  `is_toread` enum('true','false') NOT NULL DEFAULT 'false' COMMENT 'Возможность читать онлайн',
  `is_similar` enum('true','false') NOT NULL DEFAULT 'false' COMMENT 'Возможность посмотреть список похожих книг',
  `is_partners` enum('true','false') NOT NULL DEFAULT 'false' COMMENT 'Наличие партнерских ссылок',
  `is_duplicate` enum('true','false') NOT NULL DEFAULT 'false' COMMENT 'Проверка на дубль',
  `is_rightholder_lock` enum('true','false') NOT NULL DEFAULT 'false' COMMENT 'блокировка правообладателя',
  `rating_litres` int(11) DEFAULT NULL COMMENT 'рейтинг Литрес',
  `date_written` date DEFAULT NULL,
  `is_genre_deleted` tinyint(1) DEFAULT NULL,
  `is_description_blocked` enum('false','true') DEFAULT 'false' COMMENT 'не давать парсерам менять описание',
  `translator` varchar(255) DEFAULT NULL COMMENT 'Переводчики',
  `genres_count` tinyint(4) DEFAULT NULL,
  `checked_admin` enum('false','true') DEFAULT 'false',
  `no_ru` enum('false','true') DEFAULT 'false' COMMENT 'не русская версия',
  `count_authors` int(11) DEFAULT NULL,
  `updated_count_authors` enum('false','true') DEFAULT 'false' COMMENT 'Пересчитано количество авторов у книги',
  `checked_fb2` enum('false','true') DEFAULT 'false' COMMENT 'Проверена книга или фрагмент на метатеги',
  `indexed` enum('false','true') DEFAULT 'false' COMMENT 'Проиндексировано ElasticSearch',
  `innodb` enum('false','true') DEFAULT 'false',
  `index_popular` int(11) DEFAULT NULL COMMENT 'Индекс полпулярности',
  `donor_id2` int(11) DEFAULT NULL COMMENT 'дополнительный ID донора',
  `isbn` varchar(50) DEFAULT NULL,
  `index_popular_set` enum('false','true') DEFAULT 'false' COMMENT 'просчитан индекс популярности',
  `storage` tinyint(1) DEFAULT NULL COMMENT 'номер диска для файлов',
  `lng` tinyint(4) DEFAULT NULL COMMENT 'язык книги',
  `google_search` bigint(20) DEFAULT NULL,
  `litres_csv_rate` decimal(5,1) DEFAULT NULL,
  `litres_livelib_csv_reads` int(11) DEFAULT NULL,
  `livelib_csv_rate` decimal(5,1) DEFAULT NULL,
  `livelib_url` varchar(255) DEFAULT NULL,
  `livelib_book_id` int(11) DEFAULT NULL COMMENT 'если минус - наш id, если плюс - ЛЛ',
  `livelib_share_vk` int(11) DEFAULT NULL,
  `livelib_fav_num` int(11) DEFAULT NULL,
  `livelib_read_num` int(11) DEFAULT NULL,
  `livelib_plan_read` int(11) DEFAULT NULL,
  `livelib_comments_num` int(11) DEFAULT NULL,
  `livelib_quotes_num` int(11) DEFAULT NULL,
  `livelib_collections_num` int(11) DEFAULT NULL,
  `master_book` enum('true','false') DEFAULT 'true',
  `age` varchar(20) DEFAULT NULL,
  `num_pages` varchar(50) DEFAULT NULL,
  `old_book_id` int(11) DEFAULT NULL,
  `old_book_url` varchar(255) DEFAULT NULL,
  `checked_year` enum('false','true') DEFAULT 'false' COMMENT 'проверен ли год выпуска модераторами, чтоб отображать в библиографии',
  `checked_pages` enum('false','true') DEFAULT 'false',
  PRIMARY KEY (`id`),
  KEY `is_status` (`is_status`),
  KEY `view_count` (`view_count`),
  KEY `poster` (`poster`(255)),
  KEY `rating` (`rating`),
  KEY `rating_litres` (`rating_litres`),
  KEY `date_written` (`date_written`),
  KEY `is_description_blocked` (`is_description_blocked`),
  KEY `genres_count` (`genres_count`),
  KEY `checked_admin` (`checked_admin`),
  KEY `no_ru` (`no_ru`),
  KEY `count_authors` (`count_authors`),
  KEY `updated_count_authors` (`updated_count_authors`),
  KEY `checked_fb2` (`checked_fb2`),
  KEY `indexed` (`indexed`),
  KEY `count_authors_updated_count_authors` (`count_authors`,`updated_count_authors`),
  KEY `is_genre_deleted_is_status` (`is_genre_deleted`,`is_status`),
  KEY `updated_count_authors_is_status` (`updated_count_authors`,`is_status`),
  KEY `innodb` (`innodb`),
  KEY `index_popular` (`index_popular`),
  KEY `donor_id2` (`donor_id2`),
  KEY `year` (`year`),
  KEY `index_popular_set` (`index_popular_set`),
  KEY `donor` (`donor`),
  KEY `donor_id` (`donor_id`),
  KEY `google_search` (`google_search`),
  KEY `litres_csv_rate` (`litres_csv_rate`),
  KEY `litres_livelib_csv_reads` (`litres_livelib_csv_reads`),
  KEY `livelib_csv_rate` (`livelib_csv_rate`),
  KEY `master_book` (`master_book`),
  KEY `livelib_book_id` (`livelib_book_id`),
  KEY `storage` (`storage`),
  KEY `livelib_read_num` (`livelib_read_num`),
  KEY `old_book_id` (`old_book_id`),
  KEY `old_book_url` (`old_book_url`),
  KEY `checked_year` (`checked_year`),
  KEY `is_status_master_book` (`is_status`,`master_book`),
  KEY `lng` (`lng`),
  KEY `livelib_book_id_master_book` (`livelib_book_id`,`master_book`),
  KEY `is_status_master_book_indexed` (`is_status`,`master_book`,`indexed`),
  KEY `genres_count_master_book` (`genres_count`,`master_book`),
  KEY `count_authors_updated_count_authors_master_book` (`count_authors`,`updated_count_authors`,`master_book`),
  KEY `is_status_donor_no_ru_master_book` (`is_status`,`donor`,`no_ru`,`master_book`),
  KEY `livelib_url_master_book_is_status` (`livelib_url`,`master_book`,`is_status`),
  KEY `donor_donor_id_donor_id2_master_book_is_status` (`donor`,`donor_id`,`donor_id2`,`master_book`,`is_status`),
  KEY `lng_is_status_master_book` (`lng`,`is_status`,`master_book`),
  KEY `is_status_indexed` (`is_status`,`indexed`),
  KEY `books_idx_is_stat_master_livelib_id` (`is_status`,`master_book`,`livelib_read_num`,`id`),
  KEY `books_idx_livelib_num_id` (`livelib_read_num`,`id`),
  KEY `master_book_is_status` (`master_book`,`is_status`),
  KEY `is_status_master_book_year` (`is_status`,`master_book`,`year`),
  FULLTEXT KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `books_genres` (
  `book_id` int(11) NOT NULL,
  `genre_id` int(11) NOT NULL,
  `sort` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`book_id`,`genre_id`),
  UNIQUE KEY `book_id` (`book_id`,`genre_id`),
  KEY `categorie_id` (`genre_id`),
  KEY `sort` (`sort`),
  KEY `book_id2` (`book_id`),
  KEY `genre_id_book_id` (`genre_id`,`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8';

更新 1(仍然很长):

select sql_no_cache
    count(`books`.`id`) as `count`
from `books`
use index(is_status_master_book)
where 
    (
        1 = 1 
        AND `books`.`is_status` = 'active' 
        AND `books`.`master_book` = 'true'
    ) 
    AND (
        EXISTS (
            SELECT
                1 
            FROM
                `books_genres` 
            WHERE
                (
                    `books_genres`.`book_id` = `books`.`id`
                ) 
                AND (
                    `books_genres`.`genre_id` IN (307,380,385,384,1359,381,390,397,394,949,1390,1391,403,401,1332,393,398,1374,1397,402,984,1025,841,1027,359,577,365,1021,1023,360,368,369,370,942,1061,1348,1376,437,737,1137,1354,1384,1385,1115,1113,1114,1143,1363,593,581,583,567,978,973,576,677,825,595,826,1043,827,1077,323,324,1361,1362,1360,407,610,611,1179,608,336,831,1042,520,1079,1078,1081,352,1349,388,727,728,729,325,330,1099,616,320,1375,1138,1388,1119,1141,1140,1328,1136,1044,1103,1074,1150,1322)
                )
        )
    ) 

结果:

+--------+
| count  |
+--------+
| 402545 |
+--------+
1 row (1.774 s)

解释:

+------+--------------+--------------+--------+--------------------------------------------------------+-----------------------+---------+-------------+---------+--------------------------+
| id   | select_type  | table        | type   | possible_keys                                          | key                   | key_len | ref         | rows    | Extra                    |
+------+--------------+--------------+--------+--------------------------------------------------------+-----------------------+---------+-------------+---------+--------------------------+
|    1 | PRIMARY      | books        | ref    | is_status_master_book                                  | is_status_master_book | 3       | const,const |  975330 | Using where; Using index |
|    1 | PRIMARY      | <subquery2>  | eq_ref | distinct_key                                           | distinct_key          | 4       | func        |       1 |                          |
|    2 | MATERIALIZED | books_genres | index  | PRIMARY,book_id,categorie_id,book_id2,genre_id_book_id | PRIMARY               | 8       | NULL        | 1866103 | Using where; Using index |
+------+--------------+--------------+--------+--------------------------------------------------------+-----------------------+---------+-------------+---------+--------------------------+
3 rows in set (0.00 sec)

更新 2:

select sql_no_cache
    count(1) as `count`
from `books`
use index(is_status_master_book_id)
where 
    (
        1 = 1 
        AND `books`.`is_status` = 'active' 
        AND `books`.`master_book` = 'true'
    ) 
    AND (
        EXISTS (
            SELECT
                1 
            FROM
                `books_genres` 
            WHERE
                (
                    `books_genres`.`book_id` = `books`.`id`
                ) 
                AND (
                    `books_genres`.`genre_id` IN (307,380,385,384,1359,381,390,397,394,949,1390,1391,403,401,1332,393,398,1374,1397,402,984,1025,841,1027,359,577,365,1021,1023,360,368,369,370,942,1061,1348,1376,437,737,1137,1354,1384,1385,1115,1113,1114,1143,1363,593,581,583,567,978,973,576,677,825,595,826,1043,827,1077,323,324,1361,1362,1360,407,610,611,1179,608,336,831,1042,520,1079,1078,1081,352,1349,388,727,728,729,325,330,1099,616,320,1375,1138,1388,1119,1141,1140,1328,1136,1044,1103,1074,1150,1322)
                )
        )
    ) 

结果:

+--------+
| count  |
+--------+
| 402553 |
+--------+
1 row in set (3.84 sec)

更新 3:

ALTER TABLE books ADD INDEX is_status_master_book_id (is_status, master_book, id);

SELECT sql_no_cache COUNT(id) AS `count`
FROM books
use index(is_status_master_book_id)
WHERE books.is_status = 'active'
   AND books.master_book = 'true' 
   AND id IN (
        SELECT book_id
        FROM books_genres
        WHERE genre_id IN (307,380,385,384,1359,381,390,397,394,949,1390,1391,403,401,1332,393,398,1374,1397,402,984,1025,841,1027,359,577,365,1021,1023,360,368,369,370,942,1061,1348,1376,437,737,1137,1354,1384,1385,1115,1113,1114,1143,1363,593,581,583,567,978,973,576,677,825,595,826,1043,827,1077,323,324,1361,1362,1360,407,610,611,1179,608,336,831,1042,520,1079,1078,1081,352,1349,388,727,728,729,325,330,1099,616,320,1375,1138,1388,1119,1141,1140,1328,1136,1044,1103,1074,1150,1322)
    )

结果:

+--------+
| count  |
+--------+
| 402553 |
+--------+
1 row in set (1.47 sec)

【问题讨论】:

  • 1) 您正在过滤连接右侧表中的非空值,从而有效地将其转换为内连接,因此将连接类型更改为内连接。 2)我不知道category_id索引中索引了哪些字段,但它的名字暗示category_id字段可能是最左边的字段,但该字段在查询中的任何地方都没有使用。 3) book_id 上的复合索引 - books_genres 表的genre_id 应该是更理想的索引 4) 因为您只想从 books 表中获取计数,请考虑使用带有子查询而不是连接的存在。您可以取消 distinct in count
  • @Shadow 我在更新 1 中添加了结果
  • 请添加新查询的解释输出!
  • @Shadow 我添加了
  • 我认为您已经开始通过编程技术达到速度优化的下限。如果这对您来说还不够快,您可能需要调整 mysql 设置以加快速度。 SO上的mysql / mariadb和SO的DBA姐妹网站已经有很多关于这个的问题和答案。

标签: mysql mariadb query-optimization mysql-slow-query-log


【解决方案1】:

交付 400K 行需要时间。

简化索引:

PRIMARY KEY (`book_id`,`genre_id`),
UNIQUE KEY `book_id` (`book_id`,`genre_id`),  -- redundant
KEY `categorie_id` (`genre_id`),  -- in the way
KEY `sort` (`sort`),
KEY `book_id2` (`book_id`),  -- in the way
KEY `genre_id_book_id` (`genre_id`,`book_id`)

-->

PRIMARY KEY (`book_id`,`genre_id`),
KEY `sort` (`sort`),
KEY `genre_id_book_id` (`genre_id`,`book_id`)

当你有INDEX(a,b)时,你就不需要INDEX(a)了。

并摆脱use index(categorie_id)

xx_id 放在同一个表中似乎很奇怪,除非表的焦点是列出所有x。 (我指的是donor。)

查询是受 I/O 限制还是受 CPU 限制?

你有多少内存? innodb_buffer_pool_size 的值是多少?每张表有多少行?磁盘是 HDD 还是 SSD?

如果它受 I/O 限制,则有多种可能的加速。

【讨论】:

    【解决方案2】:

    首先,为了确定,使用ANALYZE TABLE 更新 MariaDB 使用的内部统计信息,以确定要使用的索引。

    ANALYZE TABLE books, book_genres;
    

    在 MariaDB 中,您可以在查询中使用 ANALYZE SELECT 代替 EXPLAIN SELECTANALYZE 实际运行查询然后显示与EXPLAIN 相同类型的输出,但具有更多详细信息。所以,用它来做你的分析。

    SELECT COUNT(),遗憾的是,在大桌子上天生就很慢。如果你这样做

    SELECT COUNT(id) AS `count`
      FROM books
     WHERE books.is_status = 'active'
       AND books.master_book = 'true' 
    

    您将获得查询所需时间的下限(最少)。您的名为is_status_master_book 的索引将有助于此查询除非您的大多数书籍都是“活动”和“主”,在这种情况下,服务器会选择表扫描,因为索引的选择性不够。让这个查询工作并研究 ANALYZE 输出。 (InnoDB 索引总是将主键附加到列列表的末尾。)

    (请注意,您的 is_status 索引与您的 is_status_master_book 索引是多余的。)

    接下来,处理您的流派查找的这个较短版本。

                   SELECT book_id
                     FROM books_genres
                    WHERE genre_id in (307,380,385,384,1359,381,390,397,394)
    

    此查询应使用books_genres 表上的genre_id_book_id。它有效吗?它的表现还不错吗?如果是这样,请使用所有的流派 ID 重试。

    如果列表越长其性能明显变差,您可以尝试重构您的应用,将长列表放入临时表中并执行

                   SELECT book_id
                     FROM books_genres
                     JOIN temptable ON books_genres.genre_id = temptable.genre_id
    

    下一步,试试这个。

    SELECT COUNT(id) AS `count`
      FROM books
     WHERE books.is_status = 'active'
       AND books.master_book = 'true' 
       AND id IN (
             SELECT book_id
               FROM books_genres
              WHERE genre_id IN ( short list )
           )
    

    这表现如何?查看分析输出。尝试使用不同的索引;如果idis_statusmaster_book 更具选择性,这可能会有所帮助。

    ALTER TABLE books ADD INDEX id_status_master (id, is_status, master);
    

    然后尝试上述查询中较长的流派列表。该查询等同于您的查询。

    【讨论】:

    • 分析表结果 - 好的。在您使用索引 id_status_master 进行查询时,我的结果时间为 1.629 秒。但是索引 ALTER TABLE books ADD INDEX is_status_master_book_id (is_status, master_book, id); 结果是 1.421 s
    【解决方案3】:

    您有一些冗余索引,我会先删除那些...不是说它们会对查询产生影响,但我会解释一下。

    如果您在 (a, b) 上有一个索引,在 (b, a) 上有另一个索引,并且您运行了一个符合 BOTH 列的查询,那么任何一个都可以工作。但是,如果您只需要列 b 作为查询的一部分,请在其上创建一个索引。如果查询列 a + 其他任何内容,也将使用 (a, b)。

    所以你的书表索引是

    is_status (is_status) is_status_master_book (is_status, master_book)

    单个“is_status”索引是多余的。通过查看其他一些索引,可能会有更好的索引选项,但在不了解您的查询上下文的情况下,我将不理会。​​p>

    现在,为了更上一层楼,对于这个特定的查询,您可能需要创建一个 COVERING 索引。这基本上意味着索引将查询请求的所有列作为索引的一部分,因此引擎永远不需要转到记录数据的各个原始页面来获取/限定结果。

    所以,我会将您的“Is_Status_Master_Book”索引更改为

    is_status_master_book (is_status, master_book, id)

    类似地,在您的书籍类型表中,您拥有的唯一键“Book_id”具有书籍 ID 和类型。但也使“genre_id_book_id”变得多余,但可以保留 categorie_id 索引,因为它涵盖了genre_id 曾经执行过一个仅针对genre_id 的查询。

    现在,供您查询。您有一个左连接,但在 where 子句中有一个“AND”Genre_id,使其成为 INNER JOIN。

        select sql_no_cache
              count( distinct b.id ) as `count`
           from 
              books b
                 join books_genres bg
                    on b.id = bg.book_id
           where 
                  1  
              and b.is_status = 'active' 
              and b.master_book = 'true' 
              and bg.genre_id in (307,380,385,384,1359,381,390,397,394,949,1390,1391,403,401,1332,393,
    398,1374,1397,402,984,1025,841,1027,359,577,365,1021,1023,360,368,369,
    370,942,1061,1348,1376,437,737,1137,1354,1384,1385,1115,1113,1114,1143,
    1363,593,581,583,567,978,973,576,677,825,595,826,1043,827,1077,323,324,
    1361,1362,1360,407,610,611,1179,608,336,831,1042,520,1079,1078,1081,352,
    1349,388,727,728,729,325,330,1099,616,320,1375,1138,1388,1119,1141,1140,
    1328,1136,1044,1103,1074,1150,1322) 
            
    

    您查询的真正意图是什么...您是否想要统计所有活跃状态的书籍,这些书籍是主书籍并且它们符合所列类型之一? 如果是这样,那是您的查询(减去 left-join 部分),但按照建议更新索引 is_status_master_book 以使其覆盖,因此它不需要转到原始数据页面来限定记录和返回结果。

    另一种方法是预先查询符合条件的类型中的不同书籍。

        select sql_no_cache
              count( distinct b.id ) as `count`
           from 
              books b
                 join 
                 ( select distinct bg.book_id
                      from books_genres bg
                      where bg.genre_id in (307,380,385,384,1359,381,390,397,394,949,1390,1391,403,401,1332,393,
    398,1374,1397,402,984,1025,841,1027,359,577,365,1021,1023,360,368,369,
    370,942,1061,1348,1376,437,737,1137,1354,1384,1385,1115,1113,1114,1143,
    1363,593,581,583,567,978,973,576,677,825,595,826,1043,827,1077,323,324,
    1361,1362,1360,407,610,611,1179,608,336,831,1042,520,1079,1078,1081,352,
    1349,388,727,728,729,325,330,1099,616,320,1375,1138,1388,1119,1141,1140,
    1328,1136,1044,1103,1074,1150,1322) ) PQ
                    on b.id = PQ.book_id
           where 
                  1  
              and b.is_status = 'active' 
              and b.master_book = 'true' 
    

    【讨论】:

    • 谢谢,我添加了更新 2,更新 1 并不快
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2016-03-23
    • 2019-09-29
    • 1970-01-01
    • 2016-07-25
    • 2022-01-04
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多