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