老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

ThinkPHP5水平分表后分頁查詢怎么弄

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

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

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

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

一次失敗的嘗試

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

成功之道

既然select * 會影響效率,那么select 出主鍵會怎樣呢?當然是相當的快!總體思路就是分兩次獲取數據,第一次先查詢出主鍵,然后第二次,根據主鍵,獲取對應的數據。具體實現如下:

核心思想

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

1. 先查詢總記錄數及主鍵id

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

2. 根據主鍵id查詢對應的完整數據。

函數封裝

1. 構造獲取總記錄數及主鍵ID的sql子查詢語句

/**
 * 構造獲取總記錄數及主鍵ID的sql子查詢語句
 * @param $table 主表名稱
 * @param $idKey 主鍵id字段名稱
 * @param string $fields 其它字段名稱,多個字段用英文逗號分隔
 * @param int $num 子表數量
 * @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;
}

調用方式:

假設buildPartitionSql函數的執行結果為$tables,那么完整的SQL語句如下:

獲取總記錄數的完整sql:

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

獲取主鍵id的完整sql:

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

2. 構造獲取指定id對應記錄的sql子查詢語句

/**
 * 構造獲取指定id對應記錄的sql子查詢語句
 * @param $table 主表名稱
 * @param $idKey 指定的id字段名稱
 * @param $idValues 指定的id字段值
 * @param int $num 子表數量
 * @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;
}

調用方式:

假設buildPartitionListSql函數的執行結果為$sql,那么完整的SQL語句如下:

select * from .$sql

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

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


當前標題:ThinkPHP5水平分表后分頁查詢怎么弄
分享地址:http://www.xueling.net.cn/article/poogip.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国色天香色欲色欲综合网 | 国产亚洲欧美精品在线 | 日本免费黄色大片 | 国产精品乱码高清在线看 | 91网站在线观看免费 | 日本黄色一区二区 | 欧美精品久久久久久久久久久 | 98精品久久久久久久 | 日本成本人三级在线观看 | 一区二区三区在线视频播放 | 国产精品无码专区 | 中文在线免费看视频 | 蜜桃91丨九色丨蝌蚪91桃色 | 亚洲欧美另类久久久精品能播放的 | 日韩国产成人精品影院 | 91精品国产综合久久久久久久久 | www.免费视频网站 | 欧美激情黑白配 | 一区二区三区黄色 | 五月婷久久综合狠狠爱97 | 国产精品永久久久久 | 中文字幕一区二区三 | 日韩欧美一区二区免费 | 人妖干美女 | 国产精品美女久久久久人 | 美女18免费 | 字幕专区码中文欧美在线 | a级一a一级在线观看 | 老头巨大挺进莹莹的体内免费视频 | 亚洲国产成人在线观看 | 蜜桃视频成人m3u8 | 蓝男色蓝摄gay裸男china | 午夜老司机免费视频 | 99精品国产福久久久久久 | 夜夜高潮夜夜爽精品欧美做爰 | 老司机福利影院在线观看 | 成年女人免费视频播放体验区 | 亚洲精品无码mⅴ在线观看 日韩一级 | 国产无套流白浆视频免费 | 色狠狠av五综合久久久 | 成人区人妻精品一区二区不卡 |