主键、索引的困惑

Water Lee 2019-08-24 02:50:56
平时建表都会习惯性创建主键,但总会忘记索引。其实是对索引不确定。有几个小白问题请教,请各位指点
场景:开发超市收银系统,创建零售信息表,很自然会创建一个流水号作为主键以便于和其它表联接(例如零售明细表)。但是实际运用时,作为主键的流水号很少会在where中出现,反而是创建时间。例如查销量,统计某个商品销售情况,生成销售报表等。这时觉得如果在创建时间上创建一个过索引会不会要好一些,但查到的资料都提醒说,创建索引后查询会加快,但 Insert 会更加费时。
这样我就矛盾了,对于超市,收银时的 Insert 是很频繁的,但后台管理时,各种报表对销量的查询也是很频繁的。
各位帮忙分析一下要不要创建这个过引。

大概表结构
零售信息表
字段:零售ID(PK),创建时间,.....(其它信息)

零售明细表
字段:零售ID,商品条码,销售数量,......(其它信息)
...全文
315 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Water Lee 2019-09-10
  • 打赏
  • 举报
回复
引用 4 楼 吉普赛的歌 的回复:
刚刚接触数据库优化的人, 往往比较希望一招定乾坤。 但实际的优化其实是往往需要根据实际的情况来。 1 数据量的大小? 2 每天产生多少新数据? 3 每天要查询多少次? 4 查询时会根据哪些条件? 上面这几点都是需要考虑的因素。请你贴出来。 按一般的优化来说呢, 在时间字段上创建索引是正常的, 不会对插入有多大影响。 如果你的系统确实有很大的业务量(比如每天几十万的新数据),另说吧。
感谢版主,确实如你所说,我考虑过多了,上一楼的hgwyl也说了这个问题。一劳永逸是我有点天真了。
Water Lee 2019-09-10
  • 打赏
  • 举报
回复
引用 3 楼 hgwyl 的回复:
我的理解 主键——表记录的唯一、最精确标识,查询某个指定记录直接 where id=xxoo,和索引所涉及的内容不一样。 索引——加快查询速度(尤其聚集索引) 曾经做过类似的系统,日期+时间作为聚集索引(这种类似系统查询都是时间段的)。 至于说创建索引Insert会更加费时,我是没感觉的;你这个算是“超前优化”了吧,反正没碰到别去管那么多先。 另外问个问题,为啥子要2个表?查询是还的join一下……?直接一个表不好吗?
主要考虑每单零售时还要记录收银员、会员、是用何种方式收款,当然还有,如果设计为一个表,这些信息就必须多次记录,如果一单上有10个商品,那收银员、会员、时间等都要重复10次了。所以考虑使用两个表。 感谢你给的建议,可能是我想太多了
hgwyl 2019-09-09
  • 打赏
  • 举报
回复
我的理解
主键——表记录的唯一、最精确标识,查询某个指定记录直接 where id=xxoo,和索引所涉及的内容不一样。
索引——加快查询速度(尤其聚集索引)

曾经做过类似的系统,日期+时间作为聚集索引(这种类似系统查询都是时间段的)。
至于说创建索引Insert会更加费时,我是没感觉的;你这个算是“超前优化”了吧,反正没碰到别去管那么多先。

另外问个问题,为啥子要2个表?查询是还的join一下……?直接一个表不好吗?
吉普赛的歌 版主 2019-09-09
  • 打赏
  • 举报
回复
刚刚接触数据库优化的人, 往往比较希望一招定乾坤。 但实际的优化其实是往往需要根据实际的情况来。 1 数据量的大小? 2 每天产生多少新数据? 3 每天要查询多少次? 4 查询时会根据哪些条件? 上面这几点都是需要考虑的因素。请你贴出来。 按一般的优化来说呢, 在时间字段上创建索引是正常的, 不会对插入有多大影响。 如果你的系统确实有很大的业务量(比如每天几十万的新数据),另说吧。
qq_37753824 2019-09-06
  • 打赏
  • 举报
回复
除了主键外就建了一个索引,对增删改影响应该没那么大吧。。。
永爱果果 2019-08-25
  • 打赏
  • 举报
回复
你这个时间得精确到毫秒吧,你用的查毫秒时间吗,我感觉你意思好像是频繁统计某天或某个时间段的小手情况吧,这样在时间上创建索引没什么意义吧

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧