MySQL 按日期查询优化排序

标签 mysql

我尽力解决了以下两个简单查询,但对于每 10 行结果集,它会扫描整个表或至少 10K 行。目前 books 表中有 20000 行。

ALTER TABLE books ADD INDEX search_INX (`book_status`, `is_reviewed`,`has_image`,`published_date`)

mysql> EXPLAIN SELECT book_id FROM books ORDER BY published_date DESC LIMIT 10;
+----+-------------+-------+-------+---------------+------------+---------+------+-------+-----------------------------+
| id | se ref  |lect_type | table | type  | possible_keys | key        | key_len | rows  | Extra                       |
+----+-------------+-------+-------+---------------+------------+---------+------+-------+-----------------------------+
|  1 | SIMPLE      | books | index | NULL          | search_INX | 11      | NULL | 20431 | Using index; Using filesort | 
+----+-------------+-------+-------+---------------+------------+---------+------+-------+-----------------------------+

mysql> EXPLAIN SELECT book_id FROM books WHERE book_status='available' AND is_reviewed=true AND has_image=true ORDER BY published_date DESC LIMIT 10;
+----+-------------+-------+------+---------------+------------+---------+-------------------+-------+--------------------------+
| id | select_type | table | type  ref               || possible_keys | key        | key_len | rows  | Extra                    |
+----+-------------+-------+------+---------------+------------+---------+-------------------+-------+--------------------------+
|  1 | SIMPLE      | books | ref  | search_INX    | search_INX | 3       | const,const,const | 10215 | Using where; Using index | 
+----+-------------+-------+------+---------------+------------+---------+-------------------+-------+--------------------------+

mysql> EXPLAIN SELECT book_id FROM books WHERE book_status='available' AND is_reviewed=true AND has_image=true ORDER BY published_date DESC LIMIT 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: books
         type: ref
possible_keys: search_INX
          key: search_INX
      key_len: 3
          ref: const,const,const
         rows: 10215
        Extra: Using where; Using index
1 row in set (0.00 sec)

Create Table: CREATE TABLE `books` (
  `book_id` int(10) unsigned NOT NULL auto_increment,
  `has_image` bit(1) NOT NULL default '',
  `is_reviewed` bit(1) NOT NULL default '\0',
  `book_status` enum('available','out of stock','printing') NOT NULL default 'available',
  `published_date` datetime NOT NULL,
  PRIMARY KEY  (`book_id`),
  KEY `search_INX` (`is_reviewed`,`has_image`,`book_status`,`published_date`)
) ENGINE=InnoDB AUTO_INCREMENT=162605 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

有没有人知道如何解决这个问题?

最佳答案

基数:

KEY `search_INX` (`is_reviewed`,`has_image`,`book_status`,`published_date`)

...很穷。如果您将 published_date 放在前面,它会加快您的查询速度。此外,为什么要索引 is_reviewed 和 has_image? bool 列甚至不能在 SQL Server 之类的系统中建立索引,因为这样做没有意义(同样,基数)。重新排列您的 key ,或在我提到的列上放置一个唯一的 key 。

关于MySQL 按日期查询优化排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169974/

相关文章:

mysql - 当字段为空时,如何让 MySQL 给出错误?

php - Doctrine 用括号替换最后一个查询字符

javascript - 拥有数千名用户的Node js电子商务

php - 使用 MySQL 和 session 登录

android - 如何将mysql数据库连接到Firebase

mysql - CakePHP 无法连接到数据库

mysql - Vagrant & Puppet - 使用 puphpet 将 sql 导入 mysql 数据库时出错

c# - C# 中的对象无法从 DBNull 转换为其他类型异常

php - 如何将 MySQL 查询转换为 PHP 代码

c# - 'buyDate' 中的未知列 'field list'