select 中and 的效率问题

一秒一次郎 2013-12-11 03:09:53
一般来说,想在数据库中查询既满足索引A字段为123,索引B字段为456的数据,需要 select * from dbname where a=123 and b=456



还有一种解决方案就是把A字段和B字段的数据拼接后放一块,也就是把123456放到一个索引字段C里面,需要的时候
select * from dbname where c=123456


个人感觉第二种比一种要快,但是能快多少呢?有没有研究过,给个参考


...全文
147 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iihero 2013-12-11
  • 打赏
  • 举报
回复
当字段值不是太长的情况下,第2种确实有效。 但是,值得一提的是,这两种并不是完全等效的。 a=123, b=456 这并不等价于 c=123456 c可以包含a和b的多种组合。(1,23456), (12, 3456) 楼主可能是确信只有一种组合。
ACMAIN_CHM 2013-12-11
  • 打赏
  • 举报
回复
第二种比一种快 但快得有限。 假设1000M 条记录。 A字段有1M个不同值,即每个值相同的约 1000条记录。 这样,定位a=123 所在的BTREE节点约 log2(1000M) = 30 次, 然后再定位 b=456 所在节点 约 log2(1000)=10次 一共做 32次搜索。 第二种,则仅需要 30 次定位。 前提假设是,第一种的索引宽度必须是和第二种相同,比如是 INT,而不能是 a char(8), b char(8) 这样比较本身的效率是不同的。 10次搜索对当前的计算机几乎也就是几百个CPU时钟周期,估计很难感觉出来。
liuxinran819 2013-12-11
  • 打赏
  • 举报
回复
抛开性能来说 除非情况很特殊 否则把两个字段放在一个字段里是违反数据库规范的 会出现一些棘手的不必要的问题 从性能上说 如果索引和字段长度设置得当 速度是差别不大的(都是在类似的B树上做查找) 但是后者速度应该不会比前者慢
rucypli 2013-12-11
  • 打赏
  • 举报
回复
快慢不好说,这和数据数据集大小 索引大小 数据分布都有关系 第一种也是只能用一个索引

56,914

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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