快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰平台游戏APP:MySQL查询的性能优化(1)查询



查询是数据库技巧中最常用的操作。查询操作的历程对照简单,首先从客户端发出查询的SQL语句,数据库办事端在接管到由客户端发来的SQL语澳门新葡亰平台游戏APP句后,履行这条SQL语句,然后将查询到的结果返回给客户端。虽然历程很简澳门新葡亰平台游戏APP单,但不合的查询要领和数据库设置,对查询的机能将会有很在的影响。

是以,本文就在MySQL中常用的查询优化技巧进行评论争论。评论争论的内容如:经由过程查询缓冲前进查询速率;MySQL对查询的自动优化;基于索引的排序;弗成达查询的检测和应用各类查询选择来前进机能。

一、 经由过程查询缓冲前进查询速率

一样平常我们应用SQL语句进行查询时,数据库办事器每次在收到客户端发来SQL后,都邑履行这条SQL语句。但当在必然距离内(如1分钟内),接到完全一样的SQL语句,也同样履行它。虽然这样可以包管数据的实时性,但在大年夜多半时刻,数据并不要求完全的实时,也便是说可以有必然的延时。假如是这样的话,在短光阴内履行完全一样的SQL就有些得不偿掉。

幸好MySQL为我们供给了查询缓冲的功能(只能在MySQL 4.0.1及以上版本应用查询缓冲)。我们可以经由过程查询缓冲在必然程度上前进查询机能。

我们可以经由过程在MySQL安装目录中的my.ini文件设置查询缓冲。设置也异常简单,只必要将query_cache_type设为1即可。在设置了这个属性后,MySQL在履行任何SELECT语句之前,都邑在它的缓冲区中查询是否在相同的SELECT语句被履行过,假如有,并且履行结果没有过时,那么就直接取查询结果返回给客户端。但在写SQL语句时留意,MySQL的查询缓冲是区分大年夜小写的。如下列的两条SELECT语句:SELECT * from TABLE1

SELECT * FROM TABLE1

上面的两条SQL语句对付查询缓冲是完全不合的SELECT。而且查询缓冲并不自动处置惩罚空格,是以,在写SQL语句时,应只管即便削减空格的应用,尤其是在SQL首和尾的空格(由于,查询缓冲并不自动截取首尾空格)。

虽然不设置查询缓冲,无意偶尔可能带来机能上的丧掉,但有一些SQL语句必要实时地查询数据,或者并不常常应用(可能一天就履行一两次)。这样就必要把缓冲关了。当然,这可以经由过程设置query_cache_type的值来关闭查询缓冲,但这就将查询缓冲永远地关闭了。在MySQL 5.0中供给了一种可以临时关闭查询缓冲的措施:SELECT SQL_NO_CACHE澳门新葡亰平台游戏APP field1, field2 FROM TABLE1

以上的SQL语句因为应用了SQL_NO_CACHE,是以,不管这条SQL语句是否被履行过,办事器都不会在缓冲区中查找,每次都邑履行它。

我们还可以将my.ini中的query_cache_type设成2,这样只有在应用了SQL_CACHE后,才应用查询缓冲。SELECT SQL_CALHE * FROM TABLE1二、MySQL对查询的自动优化

索引对付数据库是异常紧张的。在查询时可以经由过程索引来前进机能。但无意偶尔应用索引反而会低落机能。我们可以看如下的SALES表:CREATE TABLE SALES

(

ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

NAME VARCHAR(100) NOT NULL,

PRICE FLOAT NOT NULL,

SALE_COUNT INT NOT NULL,

SALE_DATE DATE NOT NULL,

PRIMARY KEY(ID),

INDEX (NAME),

INDEX (SALE_DATE)

)

假设这个表中保存了数百万条数据,而我们要查询商品号为1000的商品在2004年和2005年的匀称价格。我们可以写如下的SQL语句:SELECT AVG(PRICE) FROM SALES

WHERE ID = 1000 AND SALE_DATE BETWEEN '2004-01-01&#澳门新葡亰平台游戏APP39; AND '2005-12-31';

假如这种商品的数量异常多,差不多占了SALES表的记录的50%或更多。那么应用SALE_DATE字段上索引来谋略匀称数就有些慢。由于假如应用索引,就得对索引进行排序操作。当满意前提的记录异常多时(如占全部表的记录的50%或更多的比例),速率会变慢,这样还不如对全部表进行扫描。是以,MySQL会自动根据满意前提的数据占全部表的数据的比例自动抉择是否应用索引进行查询。

以上的查询语句要查找NAME既即是name1又即是name2的记录。很显着,这是一个弗成达的查询,WHERE前提必然是假。MySQL在履行SQL语句之前,会先阐发WHERE前提是否是弗成达的查询,假如是,就不再履行这条SQL语句了。为了验证这一点。我们首先对如下的SQL应用EXPLAIN进行测试:EXPLAIN S澳门新葡亰平台游戏APPELECT * FROM SALES WHERE NAME = “name1”

上面的查询是一个正常的查询,我们可以看到应用EXPLAIN返回的履行信息数据中table项是SALES。这阐明MySQL对SALES进行操作了。再看看下面的语句:EXPLAIN SELECT * FROM SALES WHERE NAME = “name1” AND NAME = “name2”

我们可以看到,table项是空,这阐明MySQL并没有对SALES表进行操作。

五、 应用各类查询选择来前进机能

SELECT语句除了正常的应用外,MySQL还为我们供给了很多可以增强查询机能的选项。如上面先容的用于节制查询缓冲的SQL_NO_CACHE和SQL_CACHE便是此中两个选项。在这一部分,我将先容几个常用的查询选项。

1. STRAIGHT_JOIN:强制连接顺序

当我们将两个或多个表连接起来进行查询时,我们并不用关心MySQL先连哪个表,后连哪个表。而这统统都是由MySQL内部经由过程一系列的谋略、评估,着末得出的一个连接顺序抉择的。如下列的SQL语句中,TABLE1和TABLE2并不必然是谁连接谁:SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 ,TABLE2 WHERE …

假如开拓职员必要工资地干预连接的顺序,就得应用STRAIGHT_JOIN关键字,如下列的SQL语句:SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE …

您可能还会对下面的文章感兴趣: