<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 垂直分表 其實沒啥好講,就是 主鍵+常用列 放在原表中,再講 主鍵+一些不常用列 放在另外的表中。 這樣一個數據頁就可以存放更多數據。 但是缺點也明顯,可能會增加join 或 union之類的操作。 ## 水平分表 ### 按時間分 典型應用:新聞類、qq狀態、朋友圈動態等關注實時或最近的,可以用時間劃分,比如當月一張表,上個月一張表。 ### 按區間分 通常每張表都會有個自增id,可以利用自增id分,比如 user1表 是1~50 user2表 是51~100 //insert 操作完成后,判斷id值,超過50時,創建新表 ### hash分表 實質上沒啥意思,對每一條插入的數據進行取模, 對于單挑記錄查詢還ok,如果查詢相鄰幾行數據時,就悲劇了。 ## 分表后查詢 ### 對于時間水平分表 假設朋友圈狀態表,每天都會產生20w條記錄, 建表 table_20150401 存放。 然后用cron跑一個腳本,每天晚上凌晨創建新表,比如 table_20150402。在php程序中 執行插入的函數進行封裝,使用下面這兩個函數。 ```php // 添加數據 function insertData($data){ $table = "table_".date("Ymd",time()); //生成當天表名 insert($data,$table); // 插入新的表中 } // 獲取數據 function GetData($condition){ //如果條件里面帶了時間查找,比如:$condition[time] , 則分析出對應表名,選擇對應一張或多張表 $table = "table_".date("Ymd",time()); //生成當天表名 Get($condition,$table); // 在新的表中查找 } ``` ### 對于id區間劃分 新聞或朋友圈狀態id 1~1000 1001~2000 一、數據庫里面建表 breakup_table //這個表里專門記錄,新分表和原表的 記錄數,方便確定查找哪個表 比如: news_1 1 //起始key為1 news_2 1001 //起始key為1001 news_3 2001 二、上述 news_1 之類的數據,第一次需要同數據庫拿,之后可以放到session或memcached里面 ```php function insertUser($data){ //這個值用memcached去包裹,if($count < 2001)return 3;elseif($count < 1001)return 2;else 1;   $table_num = getCurrentNewNum(); $table = "table_".$table_num); //生成指定表名 insert($data,$table); // 插入新的表中 } function GetUser($condition){ $table_num = getCurrentNewNum(); $table = "table_".$table_num); //生成指定表名 Get($condition,$table); // 在新的表中查找 } ``` ### 對于hash分表查詢 典型user表 //單獨拉出來講,因為比較特別,第一次查找可能比較花時間,因為必須根據用戶名確定去找哪個表 可以這做: ```php $md5_val = md5($user_name); //用crc32()應該也可以,但未嘗試,如果嘗試記得%u,使其不為負 $first_val = substr($md5_val, 0,1);//然后去取第一個值 $decimal = hexdec($first_val); //十六進制轉十進制 $table_num = $decimal%3 + 1; // 求余3,使得只有三張表,table_1,table_2,table_3 ``` 主要原理,利用user_name唯一性,導出md5唯一性,然后求余限制分表數量 ```php insertUser($data){ $table = "table_".$table_num); //生成指定表名 insert($data,$table); // 插入新的表中 } GetUser($condition){ $table = "table_".$table_num); //生成指定表名 Get($condition,$table); // 在新的表中查找 } ``` hash 分表也可用于id區間分表,即用id值 取模。 水平分表,典型缺點,對于group by或order by之類的查詢是災難。 
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看