1. MySQL数据库的连接和关闭
根据W3CSchool上的描述:
PHP 脚本一结束,就会关闭数据库连接。如需提前关闭连接,请使用 mysql_close() 函数。
http://www.w3school.com.cn/php/php_mysql_connect.asp
现在做PHP开发,通常会用到一些框架,一次脚本执行,对数据库的操作不一定是在一个函数里完成的。这时候频繁的连接和关闭,会降低执行效率。
为此特意做了一个实验,代码如下:
$host = '127.0.0.1';
$username = 'root';
$password = '';
$database = 'test';
$time = new rumtine();
echo '<p>插入100条数据,每次插入连接一次数据库,插入后关闭连接</p>';
$time->start();
for($i=1;$i<=100;$i++){
$query1 = "INSERT INTO testdata2(val) VALUES('{$i}')";
$con = mysql_connect($host, $username, $password);
mysql_select_db($database, $con);
mysql_query($query1);
mysql_close();
}
$time->end();
echo $time->spend().'<br/>';
echo '<p>插入100条数据,每次插入连接一次数据库,不关闭连接。</p>';
$time->start();
for($i=1;$i<=100;$i++){
$query1 = "INSERT INTO testdata2(val) VALUES('{$i}')";
$con = mysql_connect($host, $username, $password);
mysql_select_db($database, $con);
mysql_query($query1);
}
$time->end();
echo $time->spend().'<br/>';
执行五次的结果分别是:
每次操作后关闭连接:171.1 165.5 149.9 177.4 156.8
操作后不去关闭连接:144.8 142 132 146.1 137.9
2. 批量插入数据
批量INSERT记录的时候,最好能用
INSERT INTO tablename (column1, column2 ...) VALUES (val1, val2), (val1, val2), .....
这个效率比一条一条插入要快很多很多……
3. DISTINCT和GROUP BY
- Group by会根据group的字段按ASC排序
- DISTINCT可以用于计算,一共有多少种不同数值:
例如: SELECT COUNT( DISTINCT val) FROM tablename
- Group by可以用来计算,每一种不同数值,有多少:
例如: SELECT val, COUNT(val) FROM tablename GROUP BY val
- Group by一个常见用法,查询学生总成绩:
例如: 一张表scored,有学生ID(sid), 科目ID(cid), 成绩(val)
SELECT sid, sum(val) FROM scored group by sid
4. 避免在字段中定义允许为NULL,会影响查询效率。
5. 在SELECT语句前面加EXPLAIN,可以查看查询语句使用了几个索引。
6. 在命令模式下,在SELECT语句后面加 LIMIT 1 \G 可以更方便地查看记录。