mysql多列索引不工作(如预期)?

mysql多列索引不工作(如预期)?,mysql,indexing,sql-order-by,sql-execution-plan,compound-index,Mysql,Indexing,Sql Order By,Sql Execution Plan,Compound Index,我有一张这样的桌子 CREATE TABLE IF NOT EXISTS `tbl_folder` ( `id` int(11) NOT NULL AUTO_INCREMENT, `owner_userid` int(11) NOT NULL, `name` varchar(63) NOT NULL, `description` text NOT NULL, `visibility` tinyint(4) NOT NULL DEFAULT '2', `num_items`

我有一张这样的桌子

CREATE TABLE IF NOT EXISTS `tbl_folder` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `owner_userid` int(11) NOT NULL,
  `name` varchar(63) NOT NULL,
  `description` text NOT NULL,
  `visibility` tinyint(4) NOT NULL DEFAULT '2',
  `num_items` int(11) NOT NULL DEFAULT '0',
  `num_subscribers` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `owner_userid` (`owner_userid`),
  KEY `vis_sub_item` (`visibility`,`num_subscribers`,`num_items`)
) ENGINE=InnoDB
因为我有一个关于可见性、num_订阅者和num_项目的索引,所以我希望只需要查看前15行,而是55856行。有什么想法吗?谢谢

EXPLAIN SELECT t.id, name, description, owner_userid, num_items, num_subscribers
FROM  `tbl_folder`  `t` 
WHERE visibility =2
ORDER BY  `t`.`num_subscribers` DESC ,  `t`.`num_items` DESC 
LIMIT 15

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t ref vis_sub_item vis_sub_item 1 const 55856 Using where

我认为
EXPLAIN
不会考虑
OFFSET
LIMIT
子句
EXPLAIN
应该指示查询将如何执行,它使用了什么键,表是如何连接的,等等。
LIMIT
子句有点像查询后的修饰符……既然我们知道我们想要什么,就只给em第一个这么多。因此,rows字段包含查询中可能存在的行数。从那里,
OFFSET
LIMIT
将选择您想要的特定值


我想如果你在没有解释的情况下执行
SELECT
,你会得到你想要的记录数。

是的,问题是你的索引不正确。我的意思是你索引了所有3个字段,你的select查询只检查一个字段。在MySQL中,单独索引2行不同于同时索引3行

试一试


您的3个字段索引看起来不错,
EXPLAIN
很有希望

虽然上面写着“55856行”,但这只是
EXPLAIN
提供的估计值

由于
key\u len=1
,您知道它使用复合索引的第一个字节作为等式/引用

由于您的
Extra
字段中没有提到文件排序,您知道索引正在处理
orderby
/排序

如果检查
处理程序的会话统计信息,您将更好地了解实际读取的行数

次要想法:

由于您知道最终将要点击磁盘检索行,如果99%的数据具有
visibility=2
(只是推测),您可能会在
num\u订阅者
num\u项
上使用复合索引获得同样好/快速的结果。或者,如果您在
num\u订阅者上有一个索引,则可以说是好/快,这取决于它的基数/唯一性

请将您的SQL封装在“代码块”标记中,以便我们更容易阅读。它有助于它脱颖而出,使它更容易阅读。
CREATE TABLE IF NOT EXISTS `tbl_folder` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `owner_userid` int(11) NOT NULL,
  `name` varchar(63) NOT NULL,
  `description` text NOT NULL,
  `visibility` tinyint(4) NOT NULL DEFAULT '2',
  `num_items` int(11) NOT NULL DEFAULT '0',
  `num_subscribers` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `owner_userid` (`owner_userid`),
  KEY `vis_index` (`visibility`),
  KEY `vis_sub_item` (`num_subscribers`,`num_items`)
) ENGINE=InnoDB