【问题标题】:Will a Insert or Update query affect from indexed columns which are not included in query?插入或更新查询是否会影响查询中未包含的索引列?
【发布时间】:2017-03-22 21:19:20
【问题描述】:

Mysql 和 SQL 用户。这个问题与你们俩有关。它关于索引。我有一个分类网站的表结构。我有一个通用表来存储标题、描述、发布用户等。我还有这个表结构来存储有关特定广告类别的详细属性。

CREATE TABLE `ad_detail` (
  `ad_detail_id_pk` int(10) NOT NULL AUTO_INCREMENT,
  `header_id_fk` int(10) NOT NULL,
  `brand_id_fk` smallint(5) NULL,
  `brand_name` varchar(200) NULL,
  `is_brand_new` bool,
  .......
  `transmission_type_id_fk` tinyint(3) NULL,
  `transmission_type_name` varchar(200) NULL,
  `body_type_id_fk` tinyint(3) unsigned NULL,
  `body_type_name` varchar(200) NULL,
  `mileage` double NULL,
  `fuel_type_id_fk` tinyint(3) NULL,
  ......
  PRIMARY KEY (`ad_detail_id_pk`)
) 

如您所见,第一部分属性属于移动广告,第二部分属于车辆广告,依此类推,我还有其他类别的其他属性。 header_id_fk 将保存与具有公共信息的标题表的关系。所以所有这些外键都是过滤广告所涉及的。有些人可能想找到所有诺基亚制造的手机。所以然后会使用brand_id_fk。有些人可能想按燃料类型过滤车辆。如您所见,我需要索引此表中的每个过滤属性。所以现在这是我的问题。

因此,当用户发布移动广告插入语句时,将包含一定数量的字段来存储数据。但是众所周知,索引在数据检索时会提高性能,但会增加插入和更新查询的成本。那么如果我插入移动广告,该插入查询是否会受到与车辆广告索引字段相关的其他属性的影响?

【问题讨论】:

  • 为什么在 this 表中同时存在 brand_idbrand_name(以及其他对)? name 应该在另一个表中。
  • 查看我添加的 EAV 标签。

标签: mysql sql-server indexing


【解决方案1】:

是的,普通索引包含表中每一行的一行(除非您使用http://use-the-index-luke.com/sql/where-clause/null)。因此,每次在表中插入一行时,每个索引都会插入一个新行,以及相关的索引维护问题(页面拆分等)

您可以创建一个排除空值的filtered/partial 索引,这将解决INSERT 性能被您插入NULL 的字段上的索引减慢的特定问题,但您需要测试彻底解决,以确保索引仍被您希望使用的查询使用。注意不支持部分索引,AFAIK,下面是

Create Index ix_myFilteredIndex On ad_detail (brand_id_fk) Where brand_id_fk Is Not Null;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2011-04-24
    • 2010-09-12
    • 2010-09-12
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多