2016-11-09 52 views
0

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将会被使用。有些人可能想要通过燃料类型过滤车辆。因此,您可以看到我需要为此表中的每个过滤属性编制索引。所以现在这是我的问题。

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

+0

为什么你在_this_表中同时具有'brand_id'和'brand_name'(以及其他对)? 'name'只能在另一个表中使用。 –

+0

查看我添加的EAV标签。 –

回答

0

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

您可以创建一个filtered /部分索引,其中不包括空值INSERT性能的特定问题会因您要插入的字段上的索引而变慢NULL但您需要彻底测试解决方案以确保索引仍被您希望使用的查询所使用。请注意,不支持部分索引AFAIK,以下为

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