当前位置:编程学习 > C#/ASP.NET >>

一个很少人会关注到的问题,牛人进

在SQL里查询一张用户表。取出年龄大于30岁的用户。那SQL语句可以这么写
select * From user where Age>30

那现在问题来了。

如果我是把整张表都缓存下来。然后在程序里去循环这张表判断取出来对应的用户。


两种方案的效率 哪个高,并且阐述原因。 关于查询效率问题 --------------------编程问答-------------------- 查询1次,第一个办法效率高

查询1万次,且数据不变动,查询的都是age > xxx的形式,显然第二个办法效率高。(不过不是循环而是对age做hash并且排序) --------------------编程问答-------------------- 用户表的数据有10W条。你用hash怎么来做 --------------------编程问答--------------------
引用 2 楼 QQ65412123 的回复:
用户表的数据有10W条。你用hash怎么来做

看你怎么查询了。 --------------------编程问答-------------------- 这种问题你如果只是凭空想象出来的,毫无意义。

我举一个例子,你的数据库中保存了10万的用户,比如有5万条年龄都大于30岁。
那么你反复查询,并且返回所有的年龄大于30岁的用户,你等于是在做计算机内存带宽测试。 --------------------编程问答-------------------- 你没有理解我的意思。你有QQ吗?我QQ上解释给你听。这是有实际意义的问题。 --------------------编程问答-------------------- 你的实际意义大概是还有些后续算法,要写到存储过程里觉得太麻烦了,对吧?
还是存储过程比较好,在数据量很大的时候,只返回有用的结果,对服务器的内存和带宽占用率都很低,如果要自己写,很难写到这么高的水平。 --------------------编程问答-------------------- 关缓存鸟事,只管读取就行了。。。 --------------------编程问答-------------------- 很简单的办法就可以搞定。 --------------------编程问答-------------------- 毫无意义,按lz思路干脆不要数据库了,弄个天大的内存来好了 --------------------编程问答--------------------
引用 9 楼 sunshuang1s 的回复:
毫无意义,按lz思路干脆不要数据库了,弄个天大的内存来好了

亲 缓存有的时候很重要的- - --------------------编程问答-------------------- 把SQL查询的结果缓存下来不就好了。你觉得你自己写的查询会比专业的数据库软件更快? --------------------编程问答-------------------- 的确不关注,因为你只要知道什么是数据库索引就不会困惑了

至于你说>30滴还有百万,我们得问一句,什么样的系统需要你一次性把百w条数据一次性呈现出来?? --------------------编程问答--------------------
引用 10 楼 jiaoshiyao 的回复:
Quote: 引用 9 楼 sunshuang1s 的回复:

毫无意义,按lz思路干脆不要数据库了,弄个天大的内存来好了

亲 缓存有的时候很重要的- -

命中率低的缓存就是浪费 --------------------编程问答--------------------
引用 13 楼 ltcszk 的回复:
Quote: 引用 10 楼 jiaoshiyao 的回复:

Quote: 引用 9 楼 sunshuang1s 的回复:

毫无意义,按lz思路干脆不要数据库了,弄个天大的内存来好了

亲 缓存有的时候很重要的- -

命中率低的缓存就是浪费

命中率高的缓存就是神 --------------------编程问答--------------------
引用 12 楼 wanghui0380 的回复:
的确不关注,因为你只要知道什么是数据库索引就不会困惑了

至于你说>30滴还有百万,我们得问一句,什么样的系统需要你一次性把百w条数据一次性呈现出来??
对头,可能lz有特殊需求 --------------------编程问答--------------------
引用 14 楼 jiaoshiyao 的回复:
Quote: 引用 13 楼 ltcszk 的回复:

Quote: 引用 10 楼 jiaoshiyao 的回复:

Quote: 引用 9 楼 sunshuang1s 的回复:

毫无意义,按lz思路干脆不要数据库了,弄个天大的内存来好了

亲 缓存有的时候很重要的- -

命中率低的缓存就是浪费

命中率高的缓存就是神

得了吧
数据是要修改的,改一次flush一次,能有多少高命中率?

有钱没处花尽管用内存做raid,也不用在程序里面折腾了 --------------------编程问答--------------------
引用 16 楼 ltcszk 的回复:
Quote: 引用 14 楼 jiaoshiyao 的回复:

Quote: 引用 13 楼 ltcszk 的回复:

Quote: 引用 10 楼 jiaoshiyao 的回复:

Quote: 引用 9 楼 sunshuang1s 的回复:

毫无意义,按lz思路干脆不要数据库了,弄个天大的内存来好了

亲 缓存有的时候很重要的- -

命中率低的缓存就是浪费

命中率高的缓存就是神

得了吧
数据是要修改的,改一次flush一次,能有多少高命中率?

有钱没处花尽管用内存做raid,也不用在程序里面折腾了

你只能说有的时候缓存确实能够快一点
也有的时候慢一点 --------------------编程问答-------------------- 路过 --------------------编程问答-------------------- 缓存查询,不应该是简单的循环。
不同的查询需要不同的数据结构,才可以做到O(1)或者O(log(n))定位数据。
O(n)的内存循环很可能比O(log(n))的硬盘查询慢,得看这个n有多大。 --------------------编程问答-------------------- 第一次查询过后,数据库会自动给你缓存起来(内存中),
相信数据库对数据缓存的组织方式比你自己缓存起来,循环查询强多了,
数据库又不是吃白饭的
不太可能你自己随便整合缓存,就在那循环遍历,效率比数据库高 --------------------编程问答-------------------- 没那个正常的人喜欢讨论先救老婆先救妈的问题 --------------------编程问答-------------------- 使用缓存,最主要的还是制定的策略,也就是根据具体的业务分析,基本见1楼.
建议楼主不要在没有具体场景时在作假设.
--------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 楼主 QQ65412123 的回复:
在SQL里查询一张用户表。取出年龄大于30岁的用户。那SQL语句可以这么写
select * From user where Age>30

那现在问题来了。

如果我是把整张表都缓存下来。然后在程序里去循环这张表判断取出来对应的用户。


两种方案的效率 哪个高,并且阐述原因。


你根本没有搞懂缓存策略,滥用缓存。

讨论基本概念是非常必要的,不是说有些人动不动就讽刺陪人“讨论先救老婆先救妈的问题”就能证明他就能够稀里糊涂浑浑噩噩地告诉你缓存概念了。如果确实是概念问题,就应该从根源上找到问题,这样是与“授人以渔”的目的相称的。

回到你这个问题,缓存不是什么扔一堆命中率很少的数据。绝对不是把什么数据库表放到内存里!

缓存需要设计。比如说以你的sql查询为key,或者以“年龄大于30岁的用户_第1页”、“年龄大于30岁的用户_第2页”这个字符串为key,申请缓存单元,把你从数据库查询出来的记录(例如30条记录)放到缓存单元里。

会把数据放到内存,根本不算是懂了缓存。因为你要保证当后台数据有改动时,还要尽量及时地(例如在100毫秒之内)清除所有相关缓存。脏的缓存单元清除了,那么下一次再查询数据库时就会把干净的新数据放入缓存单元。

那种“把数据库表放到内存”的说法是非常“恶劣”的做法,不是正确的缓存概念。

比如说你去查询某个用户的最近一周的购物资料,那么你就可以创建一个类似“用户_23747324_最近一周购物资料”为key的缓存单元,然后把从数据库找到的5笔记录放到这个缓存单元。而绝对不是什么“把所有用户的购物资料全都放到内存”。

比如说你去查询某个用户的各种业务汇总,可能需要访问30个不同的数据库表,然后返回内存中的数据模型对象集合,那么你也是一样地把这个业务数据缓存起来。跟什么数据库表根本没有直接关系。缓存只是为了避免我们去反复访问数据库。

缓存设计,首要地是要搞懂如何设计缓存依赖。当数据改变时,我们要得到“清除缓存”通知。例如某个人的所有与购物有关的资料一旦修改,程序就会修改“用户_8384834_购物资料最后修改时间”这个缓存单元,而这个单元被作为其它几百个缓存单元的依赖单元,因此它的修改就会自动让其它的、与同一个用户的购物信息相关的各种缓存单元自动清除。懂得这一步设计,才算是懂得了缓存机制。 --------------------编程问答-------------------- 使用缓存,我们通常可以让程序处理速度提高几十倍。这个时候就需要使用缓存。而你的概念错了,你就无论如何也不能理解为什么会提高几十倍速度,那么就会举出“两种根本都无所谓的例子”来比较。 --------------------编程问答--------------------
引用 25 楼 sp1234 的回复:
使用缓存,我们通常可以让程序处理速度提高几十倍。这个时候就需要使用缓存。而你的概念错了,你就无论如何也不能理解为什么会提高几十倍速度,那么就会举出“两种根本都无所谓的例子”来比较。


顶P哥! --------------------编程问答-------------------- 数据库能干的活尽量让数据库干 指定比你的程序快 --------------------编程问答-------------------- 缓存主要是为了数据读取速度和减少和数据库交互次数,缓存里面该存什么 肯定也要规范; 像你这个大于30岁 太泛泛了,你觉得有必要存缓存吗   --------------------编程问答-------------------- 确实属于滥用缓存 --------------------编程问答-------------------- 一般只针对所有“操作用户”公有的数据才使用缓存 --------------------编程问答-------------------- 路过看看·· --------------------编程问答--------------------
引用 24 楼 sp1234 的回复:
Quote: 引用 楼主 QQ65412123 的回复:

在SQL里查询一张用户表。取出年龄大于30岁的用户。那SQL语句可以这么写
select * From user where Age>30

那现在问题来了。

如果我是把整张表都缓存下来。然后在程序里去循环这张表判断取出来对应的用户。


两种方案的效率 哪个高,并且阐述原因。


你根本没有搞懂缓存策略,滥用缓存。

讨论基本概念是非常必要的,不是说有些人动不动就讽刺陪人“讨论先救老婆先救妈的问题”就能证明他就能够稀里糊涂浑浑噩噩地告诉你缓存概念了。如果确实是概念问题,就应该从根源上找到问题,这样是与“授人以渔”的目的相称的。

回到你这个问题,缓存不是什么扔一堆命中率很少的数据。绝对不是把什么数据库表放到内存里!

缓存需要设计。比如说以你的sql查询为key,或者以“年龄大于30岁的用户_第1页”、“年龄大于30岁的用户_第2页”这个字符串为key,申请缓存单元,把你从数据库查询出来的记录(例如30条记录)放到缓存单元里。

会把数据放到内存,根本不算是懂了缓存。因为你要保证当后台数据有改动时,还要尽量及时地(例如在100毫秒之内)清除所有相关缓存。脏的缓存单元清除了,那么下一次再查询数据库时就会把干净的新数据放入缓存单元。

那种“把数据库表放到内存”的说法是非常“恶劣”的做法,不是正确的缓存概念。

比如说你去查询某个用户的最近一周的购物资料,那么你就可以创建一个类似“用户_23747324_最近一周购物资料”为key的缓存单元,然后把从数据库找到的5笔记录放到这个缓存单元。而绝对不是什么“把所有用户的购物资料全都放到内存”。

比如说你去查询某个用户的各种业务汇总,可能需要访问30个不同的数据库表,然后返回内存中的数据模型对象集合,那么你也是一样地把这个业务数据缓存起来。跟什么数据库表根本没有直接关系。缓存只是为了避免我们去反复访问数据库。

缓存设计,首要地是要搞懂如何设计缓存依赖。当数据改变时,我们要得到“清除缓存”通知。例如某个人的所有与购物有关的资料一旦修改,程序就会修改“用户_8384834_购物资料最后修改时间”这个缓存单元,而这个单元被作为其它几百个缓存单元的依赖单元,因此它的修改就会自动让其它的、与同一个用户的购物信息相关的各种缓存单元自动清除。懂得这一步设计,才算是懂得了缓存机制。
--------------------编程问答--------------------
引用 24 楼 sp1234 的回复:
Quote: 引用 楼主 QQ65412123 的回复:

在SQL里查询一张用户表。取出年龄大于30岁的用户。那SQL语句可以这么写
select * From user where Age>30

那现在问题来了。

如果我是把整张表都缓存下来。然后在程序里去循环这张表判断取出来对应的用户。


两种方案的效率 哪个高,并且阐述原因。


你根本没有搞懂缓存策略,滥用缓存。

讨论基本概念是非常必要的,不是说有些人动不动就讽刺陪人“讨论先救老婆先救妈的问题”就能证明他就能够稀里糊涂浑浑噩噩地告诉你缓存概念了。如果确实是概念问题,就应该从根源上找到问题,这样是与“授人以渔”的目的相称的。

回到你这个问题,缓存不是什么扔一堆命中率很少的数据。绝对不是把什么数据库表放到内存里!

缓存需要设计。比如说以你的sql查询为key,或者以“年龄大于30岁的用户_第1页”、“年龄大于30岁的用户_第2页”这个字符串为key,申请缓存单元,把你从数据库查询出来的记录(例如30条记录)放到缓存单元里。

会把数据放到内存,根本不算是懂了缓存。因为你要保证当后台数据有改动时,还要尽量及时地(例如在100毫秒之内)清除所有相关缓存。脏的缓存单元清除了,那么下一次再查询数据库时就会把干净的新数据放入缓存单元。

那种“把数据库表放到内存”的说法是非常“恶劣”的做法,不是正确的缓存概念。

比如说你去查询某个用户的最近一周的购物资料,那么你就可以创建一个类似“用户_23747324_最近一周购物资料”为key的缓存单元,然后把从数据库找到的5笔记录放到这个缓存单元。而绝对不是什么“把所有用户的购物资料全都放到内存”。

比如说你去查询某个用户的各种业务汇总,可能需要访问30个不同的数据库表,然后返回内存中的数据模型对象集合,那么你也是一样地把这个业务数据缓存起来。跟什么数据库表根本没有直接关系。缓存只是为了避免我们去反复访问数据库。

缓存设计,首要地是要搞懂如何设计缓存依赖。当数据改变时,我们要得到“清除缓存”通知。例如某个人的所有与购物有关的资料一旦修改,程序就会修改“用户_8384834_购物资料最后修改时间”这个缓存单元,而这个单元被作为其它几百个缓存单元的依赖单元,因此它的修改就会自动让其它的、与同一个用户的购物信息相关的各种缓存单元自动清除。懂得这一步设计,才算是懂得了缓存机制。

让人有种很想相信的感觉
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,