干货分享,灵感创作,不定期更新,敬请期待。

大数据编程之MySQL

sql xhq 1854℃ 0评论

/*通常当我们涉及到大数据高并发处理的时候,如果不注意性能问题我们的应用或网站是会卡卡的乃至崩溃,如果有远见大数据高并发应该从一开始就被重视,
那么,今天来举个大数据栗子,首先我们得搭建测试环境,
实验环境,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

总之,大家可以自己搭建一个百万级、千万级数据,自己慢慢虐就是了,实践出真理

 

转载请注明:爱游思 » 大数据编程之MySQL

喜欢 (1)

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
  1. 分页如果按主键排序是ok的,但如果是where查询的用全文检索
    forevervas2015-12-29 23:23