当前位置: 首页 > 面试题库 >

多列索引与多索引

沈自珍
2023-03-14
问题内容

我在MySQL数据库中有下表:

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将如下所示:

SELECT imgURL, view FROM secondary_images 
WHERE primaryId={$imgId} ORDER BY imgDate DESC

如您所见,我同时创建了primaryId和和imgDate索引键。我的想法是,该WHERE子句使用primaryId,而ORDER子句使用来查询结果imgDate。

我的问题是,现在使用多索引会更好吗?还是我应该使用多列索引(目前我不太了解)?

这是我从EXPLAIN得到的:

id = 1   
select_type = simple      
table = secondary_images         
type = ref
possible_keys = primaryId
key = primaryId
key_len = 5
ref = const
rows = 1
extra = Using where; Using filesort

注意:这不是使用多列索引,这是使用上表说明的结果。


问题答案:

您应该在(primaryId,imgDate)上使用多列索引,以便MySQL能够使用它来选择行和排序。

如果用于排序的所有列都不在用于选择的索引中,则MySQL使用“ filesort ”策略,该策略包括对所有行进行排序(如果行太多,则在内存中;否则在磁盘上)。

如果用于排序的所有列都在索引中,则MySQL使用索引来获取行顺序(有一些限制)。

MySQL对索引使用树结构。这允许直接按顺序访问键,而无需进行排序。

多列索引基本上是列级联的索引。这样,MySQL可以找到匹配的第一行primaryId={$imgId},然后以正确的顺序直接访问所有其他行。

在启用单行索引的情况下primaryId,MySQL可以找到所有匹配的行primaryId={$imgId},但是它将以不特定的顺序查找行;因此,之后必须对其进行排序。



 类似资料:
  • 本文向大家介绍MySQL索引使用说明(单列索引和多列索引),包括了MySQL索引使用说明(单列索引和多列索引)的使用技巧和注意事项,需要的朋友参考一下 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: 这个查询与前面的查询略有不同,但仍属于简单查询。由于age是

  • 我有大量相同类型的实体,每个实体都有大量属性,并且我只有以下两种选择来存储它们: 将每个项存储在索引中并执行多索引搜索 将所有enties存储在单个索引中,并且只搜索1个索引。 一般而言,我想要一个时间复杂度之间的比较搜索“N”实体与“M”特征在上述每一种情况!

  • 问题内容: 经过搜索,没有找到这个特定的菜鸟问题的答案。如果我错过了,我深表歉意。 在MySQL数据库中,我有一个带有以下主键的表 主键ID(发票,项目) 在我的应用程序中,我也会经常自己选择“项目”,而很少选择“发票”。我假设我将从这些列的索引中受益。 当我定义以下内容时,MySQL不会抱怨: 索引(发票),索引(项目),主键ID(发票,项目) 但是,我没有看到任何证据(使用DESCRIBE-我

  • 问题内容: 我花一些时间来优化当前数据库。 我正在专门查看索引。 有几个问题: 索引太多了吗? 索引将加速什么? 索引会减慢什么? 什么时候添加索引是个好主意? 什么时候添加索引是个坏主意? 多个索引与多列索引的优缺点 问题答案: 索引将加速什么? 数据检索-SELECT语句。 索引会减慢什么? 数据操作-INSERT,UPDATE,DELETE语句。 什么时候添加索引是个好主意? 如果您想获得更

  • 问题内容: 我在同一台Ubuntu服务器上有一个Rails 3应用程序的暂存和生产实例(使用tyre gem)。看来这两个实例都共享相同的elasticsearch索引,这显然不是我想要的。 如何使生产和登台实例使用单独的实例? 问题答案: 您需要覆盖索引名称。假设您要绑定ActiveRecord,它将根据相关模型创建索引名称。您可以使用这样的前缀来调整名称; 然后会创建一个名为的索引,以此类推。

  • 我有一个关于<code>df之间的区别的问题。loc和处。我一直在查看stackoverflow中的一些精彩资源,但它似乎没有阐明我的问题。特别是这一个……熊猫。at vs.loc(或者至少我不完全理解这里展示的是什么)。 根据熊猫留档,https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DataFrame.at.ht