愛遊思 » 大數據編程之MySQL

/*通常當我們涉及到大數據高併發處理的時候,如果不注意性能問題我們的應用或網站是會卡卡的乃至崩潰,如果有遠見大數據高併發應該從一開始就被重視,
那麼,今天來舉個大數據栗子,首先我們得搭建測試環境,
實驗環境,windows7,Apache,php,MySQL,
創建數據表(數據表可以自己設計,插入數據代碼也可以自己設計,表結構可以再簡單,數據也可以相同,MyISAM用以下php代碼執行要幾分鐘,InnoDB感覺半個鍾)*/
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`xuhao` int(10) unsigned NOT NULL,
`suijishu` int(10) unsigned NOT NULL,
`chat` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
KEY `index_name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

/*數據表有了,執行以下代碼創建大數據環境*/
<?php
$servername = “localhost”;
$username = “root”;
$password = “root”;
$dbname = “sqltest”;
function getRandChar($length){
$str = null;
$strPol = “abcdefghijklmnopqrstuvwxyz”;
$max = strlen($strPol)-1;

for($i=0;$i<$length;$i++){
$str.=$strPol[rand(0,$max)];//rand($min,$max)生成介於min和max兩個數之間的一個隨機整數
}

return $str;
}
// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢測連接
if ($conn->connect_error) {
die(“Connection failed: ” . $conn->connect_error);
}
$len = 100000;//本人執行的是100000,可以在後面再加個0試試(百萬級數據或執行10次),反正我是分開執行了4,5次
for($i=1;$i<=$len;$i++){
$sql = “INSERT INTO user (name, xuhao, suijishu, chat)
VALUES (‘”.getRandChar(6).”‘, “.$i.”, “.rand(1,10000).”,’abcdefg’)”;

if ($conn->query($sql) === TRUE) {
// echo “New record created successfully”;
} else {
echo “Error: ” . $sql . “<br>” . $conn->error;
}
}

$conn->close();
echo ‘<script>document.write(“ok”)</script>’;
?>
/*首先來說說分頁上的技巧,如果每頁y條記錄,設第n頁
做法一:
select * from table limit (n-1)*y,y;
以下是每頁5條記錄的截圖,很好,執行時間都很小
圖1

但問題來了,當分頁分頁越到後面,截圖如下
如第8001頁,就是(80001-1)*5
select * from table limit 400000,5;
截圖如下
圖2


執行時間爲1s以上,如果再加上高併發,數據庫服務器就要崩掉了
所以
做法二:
select * from table where id > (n-1)*y limit y;
同樣是第80001頁,
圖3


very good,執行時間爲0,

那麼,我們來看看索引,一個未添加索引的字段反覆執同一語句行時間在0.14s以上
圖4


name字段已添加索引,首次0.3s,再次0s
圖5、6

總之,大家可以自己搭建一個百萬級、千萬級數據,自己慢慢虐就是了,實踐出真理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章