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 :(得分:0)
是的,正常索引包含表格中每一行的一行(除非您使用oracle http://use-the-index-luke.com/sql/where-clause/null)。因此,每次在表中插入行时,每个索引都会插入一个新行,以及相关的索引维护问题(页面拆分等)
您可以创建一个filtered /部分索引来排除空值,这将解决INSERT
性能因您要插入的字段中的索引而变慢NULL
Create Index ix_myFilteredIndex On ad_detail (brand_id_fk) Where brand_id_fk Is Not Null;
但是您需要彻底测试解决方案,以确保索引仍然被您期望使用的查询使用。请注意,mysql不支持部分索引,AFAIK,以下内容适用于sql-server。
EditText