数据库技巧——MySQL十大优化技巧ITeye - 凯发娱乐

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

2019年02月21日10时50分25秒 | 作者: 恨蕊 | 标签: 优化,数据库,数据 | 浏览: 3026

作者 杰之蓝

WEB开发者不光要处理程序的功率问题,对数据库的快速拜访和相应也是一个大问题。期望本文能对咱们把握MySQL优化技巧有所协助。

1.优化你的MySQL查询缓存

在MySQL效劳器上进行查询,能够启用高速查询缓存。让数据库引擎在后台悄悄的处理是进步功能的最有用办法之一。当同一个查询被履行屡次时,假设成果是从缓存中提取,那是适当快的。

但首要的问题是,它是那么简单被躲藏起来以至于咱们大多数程序员会疏忽它。在有些处理使命中,咱们实践上是能够阻挠查询缓存作业的。

// query cache does NOT work 
$r = mysql_query("SELECT username FROM user WHERE signup_date = CURDATE()"); 
// query cache works! 
$today = date("Y-m-d"); 
$r = mysql_query("SELECT username FROM user WHERE signup_date = $today"); 
// query cache does NOT work 
$r = mysql_query("SELECT username FROM user WHERE signup_date = CURDATE()"); 
// query cache works! 
$today = date("Y-m-d"); 
$r = mysql_query("SELECT username FROM user WHERE signup_date = $today"); 


2.用EXPLAIN使你的SELECT查询愈加明晰

运用EXPLAIN关键字是另一个MySQL优化技巧,能够让你了解MySQL正在进行什么样的查询操作,这能够协助你发现瓶颈的地点,并显现出查询或表结构在哪里出了问题。

EXPLAIN查询的成果,能够通知你那些索引正在被引证,表是怎么被扫描和排序的等等。

完成一个SELECT查询(最好是比较复杂的一个,带joins方法的),在里面添加上你的关键词解说,在这儿咱们能够运用phpMyAdmin,他会通知你表中的成果。举例来说,假设当我在履行joins时,正忘掉往一个索引中添加列,EXPLAIN能协助我找到问题的地点。





添加索引到group_id field后





3.运用LIMIT 1取得仅有行

有时,当你要查询一张表是,你知道自己只需求看一行。你或许会去的一条十分共同的记载,或许只是刚好查看了任何存在的记载数,他们都满意了你的WHERE子句。

在这种情况下,添加一个LIMIT 1会令你的查询愈加有用。这样数据库引擎发现只要1后将中止扫描,而不是去扫描整个表或索引。、

// do I have any users from Alabama? 
// what NOT to do: 
$r = mysql_query("SELECT * FROM user WHERE state = Alabama"); 
if (mysql_num_rows($r) 0) { 
 // ... 
// much better: 
$r = mysql_query("SELECT 1 FROM user WHERE state = Alabama LIMIT 1"); 
if (mysql_num_rows($r) 0) { 
 // ... 
} 

4. 索引中的检索字段

索引不仅是主键或仅有键。假设你想查找表中的任何列,你应该一向指向索引。





5.保证衔接的索引是相同的类型

假设应用程序中包括多个衔接查询,你需求保证你链接的列在两头的表上都被索引。这会影响MySQL怎么优化内部联接操作。

此外,参加的列,有必要是同一类型。例如,你参加一个DECIMAL列,而一起参加另一个表中的int列,MySQL将无法运用其间至少一个目标。即便字符编码有必要同为字符串类型。

// looking for companies in my state 
$r = mysql_query("SELECT company_name FROM users 
 LEFT JOIN companies ON (users.state = companies.state) 
 WHERE users.id = $user_id"); 
// both state columns should be indexed 
// and they both should be the same type and character encoding 
// or MySQL might do full table scans 

6.不要运用BY RAND()指令

这是一个令许多新手程序员会掉进去的圈套。你或许不知不觉中制作了一个可怕的安静。这个圈套在你是用BY RAND()指令时就开端创立了。

假设您真的需求随机显现你的成果,有许多更好的途径去完成。固然这需求写更多的代码,可是能避免功能瓶颈的呈现。问题在于,MySQL或许会为表中每一个独立的行履行BY RAND()指令(这会耗费处理器的处理才能),然后给你只是回来一行。

// what NOT to do: 
$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1"); 
// much better: 
$r = mysql_query("SELECT count(*) FROM user"); 
$d = mysql_fetch_row($r); 
$rand = mt_rand(0,$d[0] - 1); 
$r = mysql_query("SELECT username FROM user LIMIT $rand, 1"); 
 


7.尽量避免SELECT *指令

从表中读取越多的数据,查询会变得更慢。他添加了磁盘需求操作的时刻,仍是在数据库效劳器与WEB效劳器是独立分隔的情况下。你将会阅历十分绵长的网络推迟,只是是由于数据不必要的在效劳器之间传输。

一直指定你需求的列,这是一个十分杰出的习气。

// not preferred 
$r = mysql_query("SELECT * FROM user WHERE user_id = 1"); 
$d = mysql_fetch_assoc($r); 
echo "Welcome {$d[username]}"; 
// better: 
$r = mysql_query("SELECT username FROM user WHERE user_id = 1"); 
$d = mysql_fetch_assoc($r); 
echo "Welcome {$d[username]}"; 
// the differences are more significant with bigger result sets 

8.从PROCEDURE ANALYSE()中取得主张

PROCEDURE ANALYSE()可让MySQL的柱结构剖析和表中的实践数据来给你一些主张。假设你的表中现已存在实践数据了,能为你的严重决议计划效劳。





9.准备好的句子

准备好的句子,能够从功能优化和安全两方面临咱们有所协助。

准备好的句子在过滤现已绑定的变量默许情况下,能给应用程序以有用的维护,避免SQL注入进犯。当然你也能够手动过滤,不过由于大多数程序员健忘的性情,很难到达作用。

// create a prepared statement 
if ($stmt = $mysqli- prepare("SELECT username FROM user WHERE state=?")) { 
 // bind parameters 
 $stmt- bind_param("s", $state); 
 // execute 
 $stmt- execute(); 
 // bind result variables 
 $stmt- bind_result($username); 
 // fetch value 
 $stmt- fetch(); 
 printf("%s is from %s\n", $username, $state); 
 $stmt- close(); 
} 

10.将IP地址存储为无符号整型

许多程序员在创立一个VARCHAR(15)时并没有意识到他们能够将IP地址以整数方式来存储。当你有一个INT类型时,你只占用4个字节的空间,这是一个固定巨细的范畴。

你有必要断定你所操作的列是一个UNSIGNED INT类型的,由于IP地址将运用32位unsigned integer。
$r = "UPDATE users SET ip = INET_ATON({$_SERVER[REMOTE_ADDR]}) WHERE user_id = $user_id"; 

十大MySQL优化技巧就介绍到这儿。

原文地址:http://www.52cfml.com/post/mysql_optimize.html
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章