您当前位置:优侠库 > 资讯攻略 >
来源:未知
2022-02-07 22:54:41 浏览: 分类:资讯攻略

数据库技巧——MySQL十大优化技巧

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

攻略资讯
安卓软件
安卓游戏