回答

收藏

多列索引和多索引

技术问答 技术问答 363 人阅读 | 0 人回复 | 2023-09-14

我在MySQL下表在数据库中:
+ J; E% |9 u: W4 {7 ^" [CREATE TABLE `secondary_images` (  `imgId` int(10) unsigned NOT NULL AUTO_INCREMENT, `primaryId` int(10) unsigned DEFAULT NULL, `view` varchar(255) DEFAULT NULL, `imgURL` varchar(255) DEFAULT NULL, `imgDate` datetime DEFAULT NULL, PRIMARY KEY (`imgId`), KEY `primaryId` (`primaryId`), KEY `imgDate` (`imgDate`)) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;SQL如下:3 ]- M/ f. R1 p4 |  K, b
SELECT imgURL,view FROM secondary_images WHERE primaryId={$imgId} ORDER BY imgDate DESC如你所见,我同时创造了它primaryId和和imgDate索引键。我的想法是,是的WHERE子句使用primaryId,而ORDER用于查询结果的子句imgDate。
: s' K( ]4 ?+ a# _7 q8 w我的问题是,现在使用多索引会更好吗?还是我应该使用多列索引(目前我不太了解)?
5 K3 {; q: p$ }3 h% r; B这是我从EXPLAIN得到的:  G+ r9 I0 e6 X" W
id = 1   select_type = simple      table = secondary_images         type = refpossible_keys = primaryIdkey = primaryIdkey_len = 5ref = constrows = 1extra = Using where; Using filesort注:这不是使用多列索引,这是使用上表的结果。( c. w& E0 K2 R7 j! v& t! o
                                                               
0 w/ P) ]* d  J# [; v    解决方案:                                                                % r0 ~. [4 a( D( X1 N) K+ B
                                                                您应该在(primaryId,imgDate)在上面使用多列索引MySQL可用于选择行和排序。' g2 s/ q; V% F. J, F! d
如果所有用于排序的列都不用于选择索引,则MySQL使用“ filesort 策略包括对所有行进行排序(如果行太多,则在内存中;否则在磁盘上)。* s( B, f* T) S- N9 ~( t- F1 l4 k
如果用于排序的所有列都在索引中,则MySQL使用索引获取行顺序(有一些限制)。) n! x0 `& c$ ^5 L0 }
MySQL树结构用于索引。这允许直接按顺序访问键,而无需排序。
5 U7 \, F. l- R" j1 b( F! f多列索引基本上是列级联索引。MySQL可以找到匹配的第一行primaryId={$imgId},然后以正确的顺序直接访问所有其他行。9 J3 d5 z; ~/ k' W
当单行索引启用时,primaryId,MySQL你可以找到所有匹配的行primaryId={$imgId},但它,它会以不特定的顺序找到行;因此,必须在以后进行排序。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则