1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      ThinkPHP5水平分表后分頁查詢怎么弄

      這篇文章主要介紹了ThinkPHP5水平分表后分頁查詢怎么弄,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

      10余年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站設(shè)計,個人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設(shè)計流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站設(shè)計,高端網(wǎng)頁制作,對成都鑿毛機等多個行業(yè),擁有豐富的網(wǎng)站制作經(jīng)驗。

      ThinkPHP5內(nèi)置了partition方法,可用于實現(xiàn)簡單的分表。新增,修改,刪除,查詢單條數(shù)據(jù)時,用partition方法都可以輕松搞定,因為這些操作有一個共同的特點,就是能事先明確的知道,我要操作的是哪一條記錄。但有一個需求,ThinkPHP5似乎沒有解決,比如當(dāng)一個大表,被拆分成若干個子表時,如何根據(jù)相關(guān)條件及排序獲取分頁數(shù)據(jù)。

      這種需求場景下,由于事先并不知道哪些數(shù)據(jù)會出現(xiàn)在第一頁,哪些數(shù)據(jù)會出現(xiàn)在第二頁,這些根據(jù)檢索條件動態(tài)匹配的列表數(shù)據(jù),該如何查詢呢?

      一次失敗的嘗試

      最先想到的也是最直接的一種方式,就是將partition方法和paginate方法結(jié)合起來,看似順理成章的事,結(jié)果悲劇了,數(shù)據(jù)庫被搞得直接奔潰。究其原因,要想實現(xiàn)分頁查詢,partition方法中需要union若干個子表,而且每個union的子表中,都是select * 的形式,這樣就會嚴重影響到查詢的效率,況且,在獲取記錄總數(shù)的時候,也完全沒必要查詢出所有字段。

      成功之道

      既然select * 會影響效率,那么select 出主鍵會怎樣呢?當(dāng)然是相當(dāng)?shù)目?!總體思路就是分兩次獲取數(shù)據(jù),第一次先查詢出主鍵,然后第二次,根據(jù)主鍵,獲取對應(yīng)的數(shù)據(jù)。具體實現(xiàn)如下:

      核心思想

      水平分表后,當(dāng)需要分頁獲取數(shù)據(jù)時,效率會變得非常低下,拆分的子表越多,對查詢性能的影響就會越大。所以核心思想就是,盡量通過主鍵id來獲取對應(yīng)的數(shù)據(jù)記錄,也就是分兩次來獲取列表數(shù)據(jù)。

      1. 先查詢總記錄數(shù)及主鍵id

      該步驟中,union 子表的select語句中,只需要列出主鍵id和其它額外必須的字段即可,不相關(guān)的字段無需出現(xiàn)。

      2. 根據(jù)主鍵id查詢對應(yīng)的完整數(shù)據(jù)。

      函數(shù)封裝

      1. 構(gòu)造獲取總記錄數(shù)及主鍵ID的sql子查詢語句

      /**
       * 構(gòu)造獲取總記錄數(shù)及主鍵ID的sql子查詢語句
       * @param $table 主表名稱
       * @param $idKey 主鍵id字段名稱
       * @param string $fields 其它字段名稱,多個字段用英文逗號分隔
       * @param int $num 子表數(shù)量
       * @param string $where 查詢條件
       * @return array
       */
      function buildPartitionSql($table,$idKey,$fields='',$num=1,$where='') {
          $countTable = [];
          $listTable = [];
          $fieldList = [$idKey];
          if ($fields) {
              $fieldList = array_merge($fieldList,explode(',',$fields));
              $fieldList = array_unique($fieldList);
          }
          $fieldStr = implode(',',$fieldList);
          for ($i = 0; $i < $num; $i++) {
              $countTable[] = sprintf('SELECT %s FROM %s_%s where 1=1 %s', $idKey, $table, ($i + 1), $where);
              $listTable[] = sprintf('SELECT %s FROM %s_%s where 1=1 %s', $fieldStr,$table, ($i + 1), $where);
          }
          $countTable = '( ' . implode(" UNION ", $countTable) . ') AS ' . $table;
          $listTable = '( ' . implode(" UNION ", $listTable) . ') AS ' . $table;
          $tables = ['countSql' => $countTable, 'listSql' => $listTable];
          return $tables;
      }

      調(diào)用方式:

      假設(shè)buildPartitionSql函數(shù)的執(zhí)行結(jié)果為$tables,那么完整的SQL語句如下:

      獲取總記錄數(shù)的完整sql:

      select count(1) as total from .$tables['countSql']

      獲取主鍵id的完整sql:

      select * from .$tables['listSql']. limit 0,10

      2. 構(gòu)造獲取指定id對應(yīng)記錄的sql子查詢語句

      /**
       * 構(gòu)造獲取指定id對應(yīng)記錄的sql子查詢語句
       * @param $table 主表名稱
       * @param $idKey 指定的id字段名稱
       * @param $idValues 指定的id字段值
       * @param int $num 子表數(shù)量
       * @return string
       */
      function buildPartitionListSql($table,$idKey,$idValues,$num=1) {
          $sql = '';
          $ids = is_array($idValues) ? implode(',',$idValues) : $idValues;
          if ($ids) {
              $listTable = [];
              for ($i = 0; $i < $num; $i++) {
                  $listTable[] = sprintf('SELECT * FROM %s_%s where %s in (%s)', $table, ($i + 1), $idKey, $ids);
              }
              $sql = '( ' . implode(" UNION ", $listTable) . ') AS ' . $table;
          }
          return $sql;
      }

      調(diào)用方式:

      假設(shè)buildPartitionListSql函數(shù)的執(zhí)行結(jié)果為$sql,那么完整的SQL語句如下:

      select * from .$sql

      注意:業(yè)務(wù)層面的所有檢索條件,都放在了第一步的union子句中,第二步只需要根據(jù)id拿數(shù)據(jù)就行了。

      感謝你能夠認真閱讀完這篇文章,希望小編分享的“ThinkPHP5水平分表后分頁查詢怎么弄”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!


      本文標(biāo)題:ThinkPHP5水平分表后分頁查詢怎么弄
      網(wǎng)址分享:http://ef60e0e.cn/article/poogip.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        康马县| 万安县| 甘德县| 桑日县| 元江| 乐安县| 墨竹工卡县| 扎鲁特旗| 梧州市| 宽甸| 绥江县| 宁安市| 特克斯县| 宣武区| 大兴区| 鄯善县| 南丹县| 韶关市| 台江县| 梅州市| 涟水县| 嘉鱼县| 柳林县| 大余县| 湖南省| 小金县| 高邑县| 库伦旗| 拉孜县| 荥经县| 汶上县| 宜兴市| 西盟| 河西区| 扎赉特旗| 康马县| 墨玉县| 佛冈县| 科技| 四子王旗| 华坪县|