MySQL数据库的执行效率对程序的执行速度影响很大,对数据库进行有效的处理和优化是非常有用的。尤其是当需要处理大量数据时。
MySQL数据库的执行效率对程序的执行速度影响很大,对数据库进行有效的处理和优化是非常有用的。尤其是当需要处理大量数据时。
1. 优化你的MySQL查询缓存
MySQL服务器上的查询可以实现高速查询缓存。提高性能的最有效方法之一是让数据库引擎在后台安静地处理它。同一个查询执行多次时,如果从缓存中提取结果,是相当快的。
但主要问题是,它是如此容易隐藏,以至于我们大多数程序员都会忽略它。在一些处理任务中,我们实际上可以阻止查询缓存工作。
//查询缓存不起作用
$ r=MySQL _ query(' SELECT username FROM user WHERE sign up _ date=CURDATE()');
//查询缓存有效!
$ today=date(' Y-m-d ');
$ r=MySQL _ query(' SELECT username FROM user WHERE sign up _ date=' $ today ' ');
//查询缓存不起作用
$ r=MySQL _ query(' SELECT username FROM user WHERE sign up _ date=CURDATE()');
//查询缓存有效!
$ today=date(' Y-m-d ');
$ r=MySQL _ query(' SELECT username FROM user WHERE sign up _ date=' $ today ' ');
2. 用EXPLAIN使你的SELECT查询更加清晰
使用EXPLAIN关键字是另一种MySQL优化技术,可以让你知道MySQL在做什么样的查询操作。这可以帮助您找到瓶颈,并显示查询或表结构哪里出错了。
EXPLAIN查询的结果可以告诉您哪些索引被引用,表是如何被扫描和排序的,等等。
实现一个选择查询(最好是带有连接的复杂查询),并向其中添加关键字解释。在这里,我们可以使用phpMyAdmin,他会告诉你表中的结果。例如,如果我在执行连接时忘记向索引中添加列,EXPLAIN可以帮助我找到问题。
3. 利用LIMIT 1取得唯一行
有时候,当您想要查询一个表时,您知道您只需要查看一行。您可能会找到一个非常独特的记录,或者只是检查任何现有记录的数量,它们都满足您的WHERE子句。
在这种情况下,添加LIMIT 1将使您的查询更有效。这样,数据库引擎将在只找到1后停止扫描,而不是扫描整个表或索引。
//我有来自阿拉巴马的用户吗?
//不要做什么:
$ r=MySQL _ query(' SELECT * FROM user WHERE state=' Alabama ' ');
if (mysql_num_rows($r) 0) {
//.
}
//好多了:
$ r=MySQL _ query(' SELECT 1 FROM user WHERE state=' Alabama ' LIMIT 1 ');
if (mysql_num_rows($r) 0) {
//.
}
4. 索引中的检索字段
索引不仅是主键或唯一键。如果要搜索表中的任何列,应该始终指向索引。
5. 保证连接的索引是相同的类型
如果应用程序包含多个连接查询,您需要确保您链接的列在两个表上都有索引。这将影响MySQL优化内部连接操作的方式。
此外,添加的列必须属于同一类型。例如,如果同时在另一个表中添加一个DECIMAL列和一个int列,MySQL将无法使用至少一个指示器。即使字符编码必须是相同的字符串类型。
//寻找我所在州的公司
$r=mysql_query('从用户中选择公司名称
打开左加入公司(users.state=companies.state)
其中users . id=$ user _ id’);
//两个状态列都应该被索引
//并且它们应该是相同的类型和字符编码
//或者MySQL可能会进行全表扫描
6. 不要使用BY RAND()命令
这是很多程序员新手都会陷入的陷阱。你可能无意识地创造了一种可怕的平静。这个陷阱是在您使用BY RAND()命令时创建的。
如果你真的需要随机显示你的结果,有很多更好的方法可以实现。确实需要写更多的代码,但是可以避免性能瓶颈。问题是MySQL可能会对表中每个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),然后只返回一行给你。
//不要做什么:
$ r=MySQL _ query(' SELECT username FROM user ORDER BY RAND()LIMIT 1 ');
//好多了:
$ r=MySQL _ query(' SELECT count(*)FROM user ');
$ d=MySQL _ fetch _ row($ r);
$rand=mt_rand(0,$ d[0]-1);
$r=mysql_query('从用户限制中选择用户名$rand,1 ');
7. 尽量避免SELECT *命令
从表中读取的数据越多,查询就越慢。他增加了磁盘操作所需的时间,即使数据库服务器和WEB服务器是独立的。你会经历很长的网络延迟,仅仅是因为数据在服务器之间不必要的传输。总是指定您需要的列,这是一个非常好的习惯。
//不是首选
$ r=MySQL _ query(' SELECT * FROM user WHERE user _ id=1 ');
$ d=MySQL _ fetch _ assoc($ r);
echo 'Welcome {$d['用户名']} ';
//更好:
$ r=MySQL _ query(' SELECT username FROM user WHERE user _ id=1 ');
$ d=MySQL _ fetch _ assoc($ r);
echo 'Welcome {$d['用户名']} ';
//结果集越大,差异越明显
8.从程序分析中获取建议()
ProcedureAnalyze()可以让MySQL的列结构分析和表中的实际数据给你一些建议。如果实际数据已经存在于您的表中,它可以为您的重要决策服务。
9.准备好的声明
准备好的语句可以从性能优化和安全性方面帮助你。
默认情况下,预处理语句可以通过过滤绑定变量来有效地保护应用程序并防止SQL注入攻击。当然也可以手动筛选,但是由于大部分程序员都比较健忘,很难达到效果。
//创建准备好的语句
if($ stmt=$ mysqli-prepare(' SELECT username FROM user WHERE state=?')) {
//绑定参数
$stmt-bind_param('s ',$ state);
//执行
$ stmt-execute();
//绑定结果变量
$ stmt-bind _ result($ username);
//获取值
$ stmt-fetch();
printf('%s来自%s\n ',$username,$ state);
$ stmt-close();
}
10. 将IP地址存储为无符号整型
许多程序员在创建VARCHAR(15)时没有意识到他们可以将IP地址存储为整数。当你有一个INT类型时,你只占用4个字节的空间,这是一个固定大小的字段。
您必须确保正在操作的列是无符号INT类型,因为IP地址将使用32位无符号整数。
1.$ r=' UPDATE users SET IP=INET _ ATON(' { $ _ SERVER[' REMOTE _ ADDR ']} ')其中user _ id=$ user _ id ';
MYSQL的查询语句很多。今天就来说说这10种。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。