隨筆-31  評(píng)論-2  文章-0  trackbacks-0

          在處理一個(gè)大數(shù)據(jù)量數(shù)據(jù)庫(kù)的時(shí)候
          突然發(fā)現(xiàn)mysql對(duì)于count(*)的不同處理會(huì)造成不同的結(jié)果

          比如執(zhí)行
          SELECT count(*) FROM tablename
          即使對(duì)于千萬(wàn)級(jí)別的數(shù)據(jù)mysql也能非常迅速的返回結(jié)果
          而對(duì)于
          SELECT count(*) FROM tablename WHERE…..
          mysql的查詢時(shí)間開(kāi)始攀升

          仔細(xì)查閱累下手冊(cè),發(fā)現(xiàn)當(dāng)沒(méi)有WHERE語(yǔ)句對(duì)于整個(gè)mysql的表進(jìn)行count運(yùn)算的時(shí)候
          MyISAM類型的表中保存有總的行數(shù),而當(dāng)添加有WHERE限定語(yǔ)句的時(shí)候Mysql需要對(duì)整個(gè)表進(jìn)行檢索
          從而得出count的數(shù)值

          突然又想起來(lái)看到的不少新興的php程序?qū)τ赾ount的處理并沒(méi)有很好的意思到這點(diǎn)
          記錄下

          順便提下mysql的DISTINCT的關(guān)鍵字有很多你想不到的用處
          1.在count 不重復(fù)的記錄的時(shí)候能用到
          比如SELECT COUNT( DISTINCT id ) FROM tablename;
          就是計(jì)算talbebname表中id不同的記錄有多少條

          2,在需要返回記錄不同的id的具體值的時(shí)候可以用
          比如SELECT DISTINCT id FROM tablename;
          返回talbebname表中不同的id的具體的值

          3.上面的情況2對(duì)于需要返回mysql表中2列以上的結(jié)果時(shí)會(huì)有歧義
          比如SELECT DISTINCT id, type FROM tablename;
          實(shí)際上返回的是 id與type同時(shí)不相同的結(jié)果,也就是DISTINCT同時(shí)作用了兩個(gè)字段,必須得id與tyoe都相同的才被排除了,與我們期望的結(jié)果不一樣

          4.這時(shí)候可以考慮使用group_concat函數(shù)來(lái)進(jìn)行排除,不過(guò)這個(gè)mysql函數(shù)是在mysql4.1以上才支持的

          5.其實(shí)還有另外一種解決方式,就是使用
          SELECT id, type, count(DISTINCT id) FROM tablename
          雖然這樣的返回結(jié)果多了一列無(wú)用的count數(shù)據(jù)(或許你就需要這個(gè)我說(shuō)的無(wú)用數(shù)據(jù))
          返回的結(jié)果是 只有id不同的所有結(jié)果和上面的4類型可以互補(bǔ)使用,就是看你需要什么樣的數(shù)據(jù)了


          posted on 2008-10-07 14:46 xiaoxinchen 閱讀(252) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 四会市| 库尔勒市| 桃江县| 正宁县| 应用必备| 莫力| 太湖县| 长汀县| 灵川县| 土默特右旗| 如皋市| 甘南县| 靖宇县| 镇赉县| 磐石市| 通化县| 阿鲁科尔沁旗| 无棣县| 赣榆县| 昌平区| 永靖县| 南丹县| 岳阳县| 长丰县| 巴林左旗| 河曲县| 西吉县| 铜梁县| 贵溪市| 谢通门县| 揭西县| 鄂尔多斯市| 宜宾市| 宣城市| 富顺县| 博湖县| 太原市| 莱西市| 长汀县| 东台市| 华安县|