Mysql limit 優化,百萬至萬萬級疾速分頁 復合索引的援用並運用於輕量級框架。本站提示廣大學習愛好者:(Mysql limit 優化,百萬至萬萬級疾速分頁 復合索引的援用並運用於輕量級框架)文章只能為提供參考,不一定能成為您想要的結果。以下是Mysql limit 優化,百萬至萬萬級疾速分頁 復合索引的援用並運用於輕量級框架正文
豈非MySQL 沒法沖破100萬的限制嗎???到了100萬的分頁就真的到了極限???
謎底是: NO !!!!
為何沖破不了100萬是由於不會設計mysql形成的。上面引見非分表法,來個猖狂的測試!一張表弄定100萬記載,而且10G
數據庫,若何疾速分頁!
好了,我們的測試又回到 collect表,開端測試結論是:
30萬數據,用分表法可行,跨越30萬他的速度會漫道你沒法忍耐!固然假如用分表+我這類辦法,那是相對完善的。然則用了我這類辦法後,不消分表也能夠完善處理!
謎底就是:復合索引! 有一次設計mysql索引的時刻,有意中發明索引名字可以任取,可以選擇幾個字段出去,這有甚麼用呢?開端的select id from
collect order by id limit 90000,10; 這麼快就是由於走了索引,可是假如加了where 就不走索引了。抱著嘗嘗看的設法主意加了
search(vtype,id) 如許的索引。然後測試
select id from collect where vtype=1 limit 90000,10; 異常快!0.04秒完成!
再測試: select id ,title from collect where vtype=1 limit 90000,10;
異常遺憾,8-9秒,沒走search索引!
再測試:search(id,vtype),照樣select id 這個語句,也異常遺憾,0.5秒。
綜上:假如關於有where 前提,又想走索援用limit的,必需設計一個索引,將where
放第一名,limit用到的主鍵放第2位,並且只能select 主鍵!
完善處理了分頁成績了。可以疾速前往id就有願望優化limit , 按如許的邏輯,百萬級的limit 應當在0.0x秒便可以分完。看來mysql
語句的優化和索引時異常主要的!
好了,回到原題,若何將下面的研討勝利疾速運用於開辟呢?假如用復合查詢,我的輕量級框架就沒的用了。分頁字符串還得本身寫,那多費事?這裡再看一個例子,思緒就出來了:
select * from collect where id in (9000,12,50,7000); 居然 0秒便可以查完!
mygod ,mysql 的索引居然關於in語句異樣有用!看來網上說in沒法用索引是毛病的!
有了這個結論,便可以很簡略的運用於輕量級框架了:
代碼以下:
$db=dblink();
$db->pagesize=20;
$sql="select id from collect where vtype=$vtype";
$db->execute($sql);
$strpage=$db->strpage();
//將分頁字符串保留在暫時變量,便利輸入
while($rs=$db->fetch_array()){
$strid.=$rs['id'].',';
}
$strid=substr($strid,0,strlen($strid)-1);
//結構出id字符串
$db->pagesize=0;
//很症結,在不刊出類的情形下,將分頁清空,如許只須要用一次數據庫銜接,不須要再開;
$db->execute("select
id,title,url,sTime,gTime,vtype,tag from collect where id in ($strid)");
<?php while($rs=$db->fetch_array()): ?>
<tr>
<td> <?php echo $rs['id'];?></td>
<td> <?php echo $rs['url'];?></td>
<td> <?php echo $rs['sTime'];?></td>
<td> <?php echo $rs['gTime'];?></td>
<td> <?php echo $rs['vtype'];?></td>
<td> <a href="?act=show&id=<?php echo $rs['id'];?>"
target="_blank"><?php echo $rs['title'];?></a></td>
<td> <?php echo
$rs['tag'];?></td>
</tr>
<?php endwhile;
?>
</table>
<?php
echo $strpage;
?>
經由過程簡略的變換,其實思緒很簡略:1)經由過程優化索引,找出id,並拼成 "123,90000,12000" 如許的字符串。2)第2次查詢找出成果。
小小的索引+一點點的修改就使mysql 可以支撐百萬乃至萬萬級的高效分頁!
經由過程這裡的例子,我反思了一點:關於年夜型體系,PHP萬萬不克不及用框架,特別是那種連sql語句都看不到的框架!由於開端關於我的輕量級框架都差點瓦解!只合適小型運用的疾速開辟,關於ERP,OA,年夜型網站,數據層包含邏輯層的器械都不克不及用框架。假如法式員掉去了對sql語句的把控,那項目標風險將會成幾何級數增長!特別是用mysql
的時刻,mysql 必定須要專業的dba 才可以施展他的最好機能。一個索引所形成的機能差異能夠是上千倍!
PS:
經由現實測試,到了100萬的數據,160萬數據,15G表,190M索引,就算走索引,limit都得0.49秒。所以分頁最好別讓他人看到10萬條今後的數據,要否則會很慢!就算用索引。經由如許的優化,mysql到了百萬級分頁是個極限!但有如許的成就曾經很不錯,假如你是用sqlserver確定卡逝世!而160萬的數據用
id in (str) 很快,根本照樣0秒。假如如許,萬萬級的數據,mysql應當也很輕易敷衍。