本文将为大家介绍MySQL数据库性能的八种方法,希望能对大家在今后的数据库管理工作中有所帮助。

1、选取最适用的字段特点

详解MySQL数据库提高功能的八种方法(优化mysql数据库的8个方法)  优化 数据库 MySQL 第1张

MySQL能够很好的支撑大数据量的存取,可是一般说来,数据库中的表越小,在它上面履行的查询也就会越快。因而,在创立表的时分,为了取得更好的功用,咱们能够将表中字段的宽度设得尽或许小。例如,在界说邮政编码这个字段时,假如将其设置为CHAR(255),显着给数据库增加了不必要的空间,乃至运用VARCHAR这种类型也是剩余的,由于CHAR(6)就能够很好的完结任务了。相同的,假如能够的话,咱们应该运用MEDIUMINT而不是BIGIN来界说整型字段。

别的一个进步功率的办法是在或许的状况下,应该尽量把字段设置为NOT NULL,这样在将来履行查询的时分,数据库不用去比较NULL值。关于某些文本字段,例如“省份”或许“性别”,咱们能够将它们界说为ENUM类型。由于在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,咱们又能够进步数据库的功用。

2、运用衔接(JOIN)来替代子查询(Sub-Queries)

MySQL从4.1开端支撑SQL的子查询。这个技能能够运用SELECT句子来创立一个单列的查询成果,然后把这个成果作为过滤条件用在另一个查询中。例如,咱们要将客户基本信息表中没有任何订单的客户删去去,就能够运用子查询先从出售信息表中将一切宣布订单的客户ID取出来,然后将成果传递给主查询,如下所示:

DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID

FROM salesinfo )

运用子查询能够一次性的完结许多逻辑上需求多个进程才干完结的SQL操作,一起也能够防止业务或许表锁死,而且写起来也很简略。可是,有些状况下,子查询能够被更有功率的衔接(JOIN).. 替代。例如,假定咱们要将一切没有订单记载的用户取出来,能够用下面这个查询完结:

SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT

CustomerID FROM salesinfo )

假如运用衔接(JOIN).. 来完结这个查询作业,速度将会快许多。尤其是当salesinfo表中对CustomerID建有索引的话,功用将会更好,查询如下:

SELECT * FROM customerinfo LEFT JOIN salesinfoON

customerinfo.CustomerID=salesinfo. CustomerID WHERE

salesinfo.CustomerID IS NULL

衔接(JOIN).. 之所以更有功率一些,是由于 MySQL不需求在内存中创立暂时表来完结这个逻辑上的需求两个进程的查询作业。

3、运用联合(UNION)来替代手动创立的暂时表

MySQL 从 4.0 的版别开端支撑 UNION 查询,它能够把需求运用暂时表的两条或更多的 SELECT 查询兼并的一个查询中。在客户端的查询会话完毕的时分,暂时表会被主动删去,然后确保数据库规整、高效。运用 UNION 来创立查询的时分,咱们只需求用 UNION作为关键字把多个SELECT 句子衔接起来就能够了,要留意的是一切 SELECT 句子中的字段数目要想同。下面的比如就演示了一个运用 UNION的查询。

SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM

author

UNION

SELECT Name, Supplier FROM product

4、业务

尽管咱们能够运用子查询(Sub-Queries)、衔接(JOIN)和联合(UNION)来创立各式各样的查询,但不是一切的数据库操作都能够只用一条或少量几条SQL句子就能够完结的。更多的时分是需求用到一系列的句子来完结某种作业。可是在这种状况下,当这个句子块中的某一条句子运转犯错的时分,整个句子块的操作就会变得不确定起来。想象一下,要把某个数据一起刺进两个相关联的表中,或许会呈现这样的状况:第一个表中成功更新后,数据库忽然呈现意外状况,形成第二个表中的操作没有完结,这样,就会形成数据的不完整,乃至会损坏数据库中的数据。要防止这种状况,就应该运用业务,它的效果是:要么句子块中每条句子都操作成功,要么都失利。换句话说,便是能够坚持数据库中数据的一致性和完整性。事物以BEGIN 关键字开端,COMMIT关键字完毕。在这之间的一条SQL操作失利,那么,ROLLBACK指令就能够把数据库康复到BEGIN开端之前的状况。

BEGIN;

INSERT INTO salesinfo SET CustomerID=14;

UPDATE inventory SET Quantity=11

WHERE item='book';

COMMIT;

业务的另一个重要效果是当多个用户一起运用相同的数据源时,它能够运用确定数据库的办法来为用户供给一种安全的拜访办法,这样能够确保用户的操作不被其它的用户所搅扰。

5、确定表

尽管业务是保护数据库完整性的一个十分好的办法,但却由于它的独占性,有时会影响数据库的功用,尤其是在很大的运用体系中。由于在业务履行的进程中,数据库将会被确定,因而其它的用户恳求只能暂时等候直到该业务完毕。假如一个数据库体系只要少量几个用户来运用,业务形成的影响不会成为一个太大的问题;但假定有不计其数的用户一起拜访一个数据库体系,例如拜访一个电子商务网站,就会发生比较严重的呼应推迟。

其实,有些状况下咱们能够经过确定表的办法来取得更好的功用。下面的比如就用确定表的办法来完结前面一个比如中业务的功用。

LOCK TABLE inventory WRITE

SELECT Quantity FROM inventory

WHEREItem='book';

...

UPDATE inventory SET Quantity=11

WHEREItem='book';

UNLOCK TABLES

这儿,咱们用一个 SELECT 句子取出初始数据,经过一些核算,用 UPDATE 句子将新值更新到表中。包括有 WRITE 关键字的LOCK TABLE 句子能够确保在 UNLOCK TABLES 指令被履行之前,不会有其它的拜访来对 inventory 进行刺进、更新或许删去的操作。

6、运用外键

确定表的办法能够保护数据的完整性,可是它却不能确保数据的关联性。这个时分咱们就能够运用外键。例如,外键能够确保每一条出售记载都指向某一个存在的客户。在这儿,外键能够把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID,任何一条没有合法CustomerID的记载都不会被更新或刺进到salesinfo中。

CREATE TABLE customerinfo

(

CustomerID INT NOT NULL ,

PRIMARY KEY ( CustomerID )

) TYPE = INNODB;

CREATE TABLE salesinfo

(

SalesID INT NOT NULL,

CustomerID INT NOT NULL,

PRIMARY KEY(CustomerID, SalesID),

FOREIGN KEY (CustomerID) REFERENCES customerinfo

(CustomerID) ON DELETECASCADE

) TYPE = INNODB;

留意比如中的参数“ON DELETE CASCADE”。该参数确保当 customerinfo 表中的一条客户记载被删去的时分,salesinfo 表中一切与该客户相关的记载也会被主动删去。假如要在 MySQL 中运用外键,一定要记住在创立表的时分将表的类型界说为业务安全表 InnoDB类型。该类型不是 MySQL 表的默许类型。界说的办法是在 CREATE TABLE 句子中加上 TYPE=INNODB。如例中所示。

7、运用索引

索引是进步数据库功用的常用办法,它能够令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询句子傍边包括有MAX(), MIN()和ORDERBY这些指令的时分,功用进步更为显着。那该对哪些字段树立索引呢?一般说来,索引应树立在那些将用于JOIN, WHERE判别和ORDER BY排序的字段上。尽量不要对数据库中某个含有许多重复的值的字段树立索引。关于一个ENUM类型的字段来说,呈现许多重复值是很有或许的状况,例如customerinfo中的“province”.. 字段,在这样的字段上树立索引将不会有什么协助;相反,还有或许下降数据库的功用。

咱们在创立表的时分能够一起创立适宜的索引,也能够运用ALTER TABLE或CREATE INDEX在今后创立索引。此外,MySQL从版别3.23.23开端支撑全文索引和查找。全文索引在MySQL 中是一个FULLTEXT类型索引,但仅能用于MyISAM 类型的表。关于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再运用ALTER TABLE或CREATE INDEX创立索引,将是十分快的。但假如将数据装载到一个已经有FULLTEXT索引的表中,履行进程将会十分慢。

8、优化的查询句子

绝大多数状况下,运用索引能够进步查询的速度,但假如SQL句子运用不恰当的话,索引将无法发挥它应有的效果。下面是应该留意的几个方面。首要,最好是在相同类型的字段间进行比较的操作。在MySQL 3.23版之前,这乃至是一个有必要的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较;可是作为特别的状况,在CHAR类型的字段和VARCHAR类型字段的字段巨细相同的时分,能够将它们进行比较。其次,在建有索引的字段上尽量不要运用函数进行操作。

例如,在一个DATE类型的字段上运用YEAE()函数时,将会使索引不能发挥应有的效果。所以,下面的两个查询尽管回来的成果相同,但后者要比前者快得多。

SELECT * FROM order WHERE YEAR(OrderDate)
转载请说明出处
知优网 » 详解MySQL数据库提高功能的八种方法(优化mysql数据库的8个方法)

发表评论

您需要后才能发表评论