百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> php优化数据库的办法
分享文章到:

php优化数据库的办法

发布时间:09/01 来源:未知 浏览: 关键词:

php优化数据库的办法:1、拔取最适用的字段属性;2、使用连接JOIN来代替子查询“Sub-Queries”;3、使用结合“UNION”来代替手动创立的暂时表;4、使用外键;5、使用索引;6、使用优化的查询语句。

引荐:《mysql教程》

本文商量了提高MySQL 数据库机能的思绪,并从8个方面给出了详细的解决办法。

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 salesinfo ON 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)<2001;
SELECT * FROM order WHERE OrderDate<"2001-01-01";

一样的情形也会发生在对数值型字段停止运算的时候:

SELECT * FROM inventory WHERE Amount/7<24;
SELECT * FROM inventory WHERE Amount<24*7;

上面的两个查询也是返回雷同的结果,但后面的查询将比前面的一个快许多。第三,在搜索字符型字段时,我们有时会使用 LIKE 关键字和通配符,这种做法虽然简便,但却也是以牺牲系统机能为代价的。例如下面的查询将会比力表中的每一笔记录。

SELECT * FROM books
WHERE name like "MySQL%"

但是假如换用下面的查询,返回的结果一样,但速度就要快上许多:

SELECT * FROM books
WHERE name>="MySQL"and name<"MySQL"

最后,应当留意幸免在查询中让MySQL停止主动类型转换,由于转换历程也会使索引变得不起作用。

以上就是php优化数据库的办法的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板