WEB开发人员不仅要解决程序效率的问题,还要解决快速访问数据库的问题。希望这篇文章能帮助你掌握mysql优化技巧。
1.优化您的MySQL查询缓存
MySQL服务器上的查询可以实现高速查询缓存。提高性能的最有效方法之一是让数据库引擎在后台安静地处理它。同一个查询执行多次时,如果从缓存中提取结果,是相当快的。
但主要问题是,它是如此容易隐藏,以至于我们大多数程序员都会忽略它。在一些处理任务中,我们实际上可以阻止查询缓存工作。
1.//查询缓存不起作用
2.$ r = MySQL _ query(& quot;从注册日期& gt的用户中选择用户名= CURDATE()& quot;);
3.
4.//查询缓存有效!
5.$ today = date(& quot;y-m-d & quot;);
6.$ r = MySQL _ query(& quot;从注册日期& gt的用户中选择用户名= ' $ today ' & quot);
7.
8.//查询缓存不起作用
9.$ r = MySQL _ query(& quot;从注册日期& gt的用户中选择用户名= CURDATE()& quot;);
10.
11.//查询缓存有效!
12.$ today = date(& quot;y-m-d & quot;);
13.$ r = MySQL _ query(& quot;从注册日期& gt的用户中选择用户名= ' $ today ' & quot);
2.使用EXPLAIN使您的选择查询更加清晰
使用EXPLAIN关键字是另一种MySQL优化技术,可以让你知道MySQL在做什么样的查询操作。这可以帮助您找到瓶颈,并显示查询或表结构哪里出错了。
EXPLAIN查询的结果可以告诉您哪些索引被引用,表是如何被扫描和排序的,等等。
实现一个选择查询(最好是带有连接的复杂查询),并向其中添加关键字解释。在这里,我们可以使用phpMyAdmin,他会告诉你表中的结果。例如,如果我在执行连接时忘记向索引中添加列,EXPLAIN可以帮助我找到问题。
将索引添加到group_id字段后
3.使用限制1获得唯一的线。
有时候,当您想要查询一个表时,您知道您只需要查看一行。您可能会找到一个非常独特的记录,或者只是检查任何现有记录的数量,它们都满足您的WHERE子句。
在这种情况下,添加限制1将使您的查询更有效。这样,数据库引擎将在只找到1后停止扫描,而不是扫描整个表或索引。
1.//我有来自阿拉巴马的用户吗?
2.//不要做什么:
3.$ r = MySQL _ query(& quot;SELECT * FROM用户,其中state = ' Alabama ' & quot);
4.if(MySQL _ num _ rows($ r)& gt;0) {
5.// ...
6.}
7.//好多了:
8.$ r = MySQL _ query(& quot;SELECT 1 FROM user WHERE state = ' Alabama ' LIMIT 1 & quot;);
9.if(MySQL _ num _ rows($ r)& gt;0) {
10.// ...
11.}
4.索引中的搜索字段
索引不仅是主键或唯一键。如果要搜索表中的任何列,应该始终指向索引。
5.请确保连接的索引属于同一类型。
如果应用程序包含多个连接查询,您需要确保您链接的列在两个表上都有索引。这将影响MySQL优化内部连接操作的方式。
此外,添加的列必须属于同一类型。例如,如果同时在另一个表中添加一个DECIMAL列和一个int列,MySQL将无法使用至少一个指示器。即使字符编码必须是相同的字符串类型。
1.//寻找我所在州的公司
2.$ r = MySQL _ query(& quot;从用户中选择公司名称
3.打开左加入公司(users.state = companies.state)
4.其中users.id = $ user _ id & quot);
5.
6.//两个状态列都应该被索引
7.//并且它们应该是相同的类型和字符编码
8.//或者MySQL可能会进行全表扫描
6.不要使用BY RAND()命令
这是很多程序员新手都会陷入的陷阱。你可能无意识地创造了一种可怕的平静。这个陷阱是在您使用BY RAND()命令时创建的。
如果你真的需要随机显示你的结果,有很多更好的方法可以实现。确实需要写更多的代码,但是可以避免性能瓶颈。问题是MySQL可能会对表中每个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),然后只返回一行给你。
1.//不要做什么:
2.$ r = MySQL _ query(& quot;从用户订单中选择用户名,RAND()LIMIT 1 & quot;);
3.//好多了:
4.$ r = MySQL _ query(& quot;SELECT count(*)FROM user & quot;);
5.$ d = MySQL _ fetch _ row($ r);
6.$rand = mt_rand(0,$ d[0]-1);
7.
8.$ r = MySQL _ query(& quot;从用户限制$rand,1 & quot中选择用户名。);
7.尽量避免使用SELECT *命令。
从表中读取的数据越多,查询就越慢。他增加了磁盘操作所需的时间,即使数据库服务器和web服务器是独立的。你会经历很长的网络延迟,仅仅是因为数据在服务器之间不必要的传输。
总是指定您需要的列,这是一个非常好的习惯。
1.//不是首选
2.$ r = MySQL _ query(& quot;SELECT * FROM user其中user _ id = 1 & quot);
3.$ d = MySQL _ fetch _ assoc($ r);
4.回声& quot欢迎使用{$d['用户名']} & quot;;
5.//更好:
6.$ r = MySQL _ query(& quot;从user _ id = 1 & quot的用户中选择用户名);
7.$ d = MySQL _ fetch _ assoc($ r);
8.回声& quot欢迎使用{$d['用户名']} & quot;;
9.//结果集越大,差异越明显
8.从程序分析中获取建议()
ProcedureAnalyze()可以让MySQL的列结构分析和表中的实际数据给你一些建议。如果实际数据已经存在于您的表中,它可以为您的重要决策服务。
9.准备好的声明
准备好的语句可以从性能优化和安全性方面帮助你。
默认情况下,预处理语句可以通过过滤绑定变量来有效地保护应用程序并防止SQL注入攻击。当然也可以手动筛选,但是由于大部分程序员比较健忘,很难达到效果。
1.//创建准备好的语句
2.if($ stmt = $ mysqli-& gt;准备(& quot从state=的用户中选择用户名?")) {
3.//绑定参数
4.$ stmt-& gt;bind_param("s & quot,$ state);
5.//执行
6.$ stmt-& gt;执行();
7.//绑定结果变量
8.$ stmt-& gt;bind _ result($ username);
9.//获取值
10.$ stmt-& gt;fetch();
11.printf(& quot;%s来自% s \ n & quot,$用户名,$状态);
12.$ stmt-& gt;close();
13.}
10.将IP地址存储为无符号整数。
许多程序员在创建VARCHAR(15)时没有意识到他们可以将IP地址存储为整数。当你有一个INT类型时,你只占用空的4个字节,这是一个固定大小的字段。
您必须确保正在操作的列是无符号INT类型,因为IP地址将使用32位无符号整数。
1.$ r = & quot更新用户设置ip = INET关键字标签:MySQL,database
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227144.html