搜索一列没有索引或其中两列有索引
Posted
技术标签:
【中文标题】搜索一列没有索引或其中两列有索引【英文标题】:search by one column without index or two one of them has index 【发布时间】:2018-06-22 18:45:15 【问题描述】:我想根据您的经验知道哪种情况更快
查询超过1000万条记录的表,分两种情况:
search1
在单个 product_id
列上
search2
两列 shop_name
(已编入索引)和 product_id
原来是这样的
search1 = select * from table where product_id = 123456
search 2 = select * from table where shopname ='abz' and product_id = 123456
第二次搜索有店名索引
哪一个会更快?
如果我了解索引的工作原理,第二个会更快
因为它只会搜索 shopname ='abz' 的 id 而忽略其他记录
这是正确的还是我遗漏了什么
【问题讨论】:
始终尽量避免查询未编入索引的列表。所以也索引product_id
@juergen d 据我所知,索引过多会减慢插入和删除速度。那么您是否建议将其中 2 个编入索引?它会影响插入,因为我每天向该表插入太多数据或其中一个列 id 足够?
【参考方案1】:
对于您的两个查询,最佳索引是table(product_id, shopname)
。这个索引可以被两个where
子句完全使用。
如果您拥有的唯一索引位于shopname
,那么在大多数情况下,第二个查询应该更快。也就是说,product_id
不在索引中,也不属于主键。
如果您的店铺名称很少,并且表格无法放入内存,那么您最终可能会遇到一种称为抖动的情况。但是,除此之外,仅shopname
上的索引应该更快,但上面提到的索引似乎是您真正想要的。
【讨论】:
在我的情况下,shopname 将重复多次,从 100 到无限次,因为每个商店可以有很多产品,但是对于 product_id,它对所有商店都是唯一的,你建议使用多列索引表(product_id , shopname) 正如你所提到的? @JoumanaIssa 。 . .是的,如果这些是您想要运行的查询,您应该使用多列索引。【参考方案2】:根据我的经验,这是我在 RDBS SELECT SQL 中实际看到的:
当我从没有提及索引列值的表中选择数据时,通常需要很长时间才能完成运行,有时可能会导致性能问题。
但是,当我在索引列中包含完整范围的客户编号时,它神奇地运行得更快!
所以,我的答案是使用 SQL.2,因为它更快。
SQL.1) sql 引擎不知道从哪里开始,所以它会进行表空间扫描。
SQL.2) sql 引擎有一些东西可以启动,它会执行索引扫描,这在实用性上更快。
然而,在所有情况下可能都不是这样,这取决于您的数据是如何设计的......可能存在 SQL.1 工作得更快的情况,因为表空间扫描在第一页本身有记录,而索引扫描有伸手到商店,然后得到产品。无论如何,对于一个整体高效的解决方案来说,SQL.2 会更好。
希望对你有帮助:)
【讨论】:
以上是关于搜索一列没有索引或其中两列有索引的主要内容,如果未能解决你的问题,请参考以下文章
使用pandas创建稀疏矩阵,并使用来自.dat文件的其他两列的索引[x,y]的.dat文件的一列中的值填充它
sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??