隨筆-31  評論-2  文章-0  trackbacks-0

          在處理一個大數據量數據庫的時候
          突然發現mysql對于count(*)的不同處理會造成不同的結果

          比如執行
          SELECT count(*) FROM tablename
          即使對于千萬級別的數據mysql也能非常迅速的返回結果
          而對于
          SELECT count(*) FROM tablename WHERE…..
          mysql的查詢時間開始攀升

          仔細查閱累下手冊,發現當沒有WHERE語句對于整個mysql的表進行count運算的時候
          MyISAM類型的表中保存有總的行數,而當添加有WHERE限定語句的時候Mysql需要對整個表進行檢索
          從而得出count的數值

          突然又想起來看到的不少新興的php程序對于count的處理并沒有很好的意思到這點
          記錄下

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

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

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

          4.這時候可以考慮使用group_concat函數來進行排除,不過這個mysql函數是在mysql4.1以上才支持的

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


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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 榆林市| 札达县| 金山区| 邻水| 肥城市| 抚顺市| 大方县| 乡宁县| 灌云县| 北票市| 佛山市| 简阳市| 贞丰县| 南召县| 类乌齐县| 旬阳县| 萨迦县| 民勤县| 永寿县| 兴宁市| 旌德县| 邮箱| 清涧县| 六安市| 皋兰县| 平和县| 吉隆县| 大连市| 玉山县| 霍城县| 金华市| 江永县| 榆社县| 西平县| 曲靖市| 安多县| 新竹市| 侯马市| 东辽县| 双鸭山市| 舞钢市|