隨筆-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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 玉门市| 灵宝市| 阿克苏市| 襄樊市| 彭州市| 泰和县| 水富县| 申扎县| 固镇县| 屏东县| 阿图什市| 吉首市| 贺兰县| 忻城县| 盐津县| 梁河县| 常州市| 吕梁市| 肥东县| 温泉县| 冀州市| 阿勒泰市| 安图县| 台南市| 榆中县| 甘谷县| 盐津县| 思茅市| 临桂县| 碌曲县| 孟连| 聊城市| 思南县| 虞城县| 长治县| 雷波县| 包头市| 平和县| 弥勒县| 松滋市| 巴彦淖尔市|