草庐IT

Indexing

全部标签

mysql - 在主键上创建和索引有什么好处吗?

我检查了这篇SO帖子:What'sthedifferencebetweenprimarykey,uniquekey,andindexinMySQL?并找到语句:AlsonotethatcolumnsdefinedasprimarykeysoruniquekeysareautomaticallyindexedinMySQL.基于此,我有两个问题:我是否可以安全地假设在主键上创建索引本身没有性能优势,因为主键在设计上就是一个索引?也许更重要的问题是:如果您正在做人们引用的经典示例,基于姓氏和名字执行SELECT,并且该表有一个您也经常SELECT的主键,您将索引创建为(primary_ke

mysql - innodb 聚集二级索引和范围查询的问题

我最近读到关于innodb表,在(something,primary_key)上放置索引是多余的,因为主键自动与所有二级索引聚集在一起。因此,为了减小索引大小,我复制了我的表,删除了冗余主键,并进行了一些测试查询,我发现它的行为与具有“冗余”主键的原始表不同。Explain告诉我它正在做相交:Usingintersect(idx_faver_idx_id,PRIMARY);下面是查询。如果我删除"ANDFavorite.id然后它按预期工作并使用正确的索引(idx_faver_idx_id)。SELECT`Item`.`id`,`Item`.`cached_image`,`Item`.

mysql - 我怎样才能说服这个 MYSQL 查询使用索引?

下面是有关查询的解释..mysql>EXPLAINSELECTorders_0.id,orders_0.created_at,orders_0.total_amount,orders_0.delivery_date,orders_0.customer_id,orders_0.items_summary,orders_0.site_id,orders_0.depot_id,orders_0.region_id,addresses_0.country,orders_0.payment_status,orders_0.created_by,orders_0.status,orders_0.d

当表很大时,mysql 查询不使用索引

我有一张table:CREATETABLE`p`(`id`bigint(20)unsignedNOTNULL,`rtime`datetimeNOTNULL,`d`int(10)NOTNULL,`n`int(10)NOTNULL,PRIMARYKEY(`rtime`,`id`,`d`)USINGBTREE)ENGINE=MyISAMDEFAULTCHARSET=latin1;我有一个问题:selectid,d,sum(n)frompwherertimebetween'2012-08-25'anddate(now())groupbyid,d;我正在一个小表(2条记录)上对此查询运行解释,它

mysql - 使用 GUID/UUID 键优化 Innodb 表索引

我有一个基于InnoDB的模式,其中包含大约100个表,大多数使用GUID/UUID作为主键。我开始这个的时候我并没有真正理解UUIDPK在磁盘IO和碎片方面的含义,但希望在处理服务器集群时避免使用单个key分配器的好处。我们目前没有处理大量的行,但我们会(数以亿计)并且我想为此做好准备。现在我更好地理解了InnoDB中的索引,特别是主键的集群性质,我可以看到我的UUID从磁盘IO的角度来看是一个糟糕的可伸缩性选择,但我不想停止使用它们,因为满足服务器集群需求。接受/推荐的解决方案似乎是自动增量PK(INT|BIGINT)与唯一索引UUID键的混合。我的目的是向每个表添加一个新的第一列

MySQL 使用索引最快的结果

我有以下带有索引的结构,可以帮助我们更快地检索:CREATETABLEIFNOTEXISTS`index_site`(`id_building`char(32)NOTNULL,`id_client`char(32)NOTNULL,`id_broker`smallint(5)unsignedNOTNULL,`kind_client`char(1)NOTNULL,`city`smallint(6)unsignedNOTNULL,`lat`float(10,6)NOTNULL,`lng`float(10,6)NOTNULL,`zone`smallint(2)unsignedNOTNULL,`

mysql - 为什么在将列从 VARCHAR 转换为 DATETIME 后查询运行速度变慢

我有一个表,其中有一列record_datetime,它曾经是一个VARCHAR。我尝试将其更改为DateTime,因为它应该如此,但查询花费了更多时间[几乎多了10倍]。为什么会变慢??这个表有接近1亿行,record_datetime是一个索引。我尝试运行的测试查询是SELECT*FROMtable1WHERE`record_datetime`>='2012-06-1200:00:00'AND`Source`=6ORDERBY`redord_datetime`Source是PRIMARYKEY的一部分,它是user_id、record_datetime和Source的组合。reco

mysql - 优化大型关键字表?

我有一张像这样的大tableCREATETABLEIFNOTEXISTS`object_search`(`keyword`varchar(40)COLLATElatin1_german1_ciNOTNULL,`object_id`int(10)unsignedNOTNULL,PRIMARYKEY(`keyword`,`media_id`))ENGINE=InnoDBDEFAULTCHARSET=latin1COLLATE=latin1_german1_ci;大约3900万行(使用超过1GB的空间)包含对象表中100万条记录的索引数据(其中object_id指向)。现在用这样的查询来搜索

mysql - 为什么我不能在我已经为其建立索引的 MySQL 查询中摆脱文件排序

我有一个具有以下架构的表Id,INT,主键QueryId,整数创建时间,日期时间我创建了复合index(QueryId,CreatedTime)我跑的时候怎么会这样解释select*fromtestwherequeryidin(1,6)orderbycreatedtimedesc我仍然得到以下具有文件排序的信息?知道如何删除文件排序吗?“使用哪里;使用文件排序” 最佳答案 您实际上还没有构建可用于该查询的索引。索引只能用于从最左列向右查找和排序。一旦遇到无用的东西,索引的其余部分就会被忽略。您没有发布EXPLAIN的输出,但我怀疑如

mysql - deleted_at 列的 SQL 索引

在SQL数据库的deleted_at列上添加索引是最佳实践还是有益的?我的很多查询都使用WHEREdeleted_atISNULL,添加deleted_at索引会加快我的查询速度还是减慢它们的速度? 最佳答案 @Barmar最好地回答了这个问题:“你是否应该索引它取决于它对你的表进行分区的程度。如果大多数行没有被删除,索引它不会有太大帮助。此外,如果你有其他列索引,并且你一起测试它们使用deleted_at,那么您将需要使用deleted_at的其他列的复合索引才能获得好处。” 关于my