`

Mysql 查询优化笔记续

    博客分类:
  • WEB
阅读更多
上一篇笔记的粒度比较粗,这里尽量细致点,不是每条都验证过,根据实际需要供参考。

1、选取适用的字段属性
   数据库优化是一个比较系统的工作,设计数据表时候就应该考虑到字段属性设置合理。虽然可以用字符串省掉很多设计数据表字段属性的麻烦,但是不建议这样操作。将来检索越小的字段,速度很定越快。
①在创建数据表时候,满足应用前提下字段宽度设得尽可能小。能用char(6)就不用char(255)
②可能的情况下,尽量把字段设置为not null,这样在执行查询时候数据库不用去比较null值
③数值型数据比文本型快得多,如:“省份”“性别”可以设置成ENUM类型,Mysql中ENUM当做数值处理。


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

例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户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)<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<”MySQM”


最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。



分享到:
评论

相关推荐

    mysql优化笔记+资料

    这些笔记涵盖了MySQL优化的主要方面,包括查询优化、SQL编写技巧、数据库设计、存储引擎选择、服务器配置、硬件升级、定期维护以及使用各种工具进行监控和调优。通过这些方法,你可以有效地提升MySQL数据库的运行...

    mysql优化笔记.doc

    MySQL数据库的优化是一个涵盖多个方面的复杂任务,旨在提高性能、减少资源消耗并确保系统的稳定性。以下是一些关键的优化策略: 1. **表的设计合理化(3NF)**: - **第一范式(1NF)**:确保每一列都具有原子性,...

    mysql笔记 mysql笔记

    mysql笔记 mysql笔记 mysql笔记 mysql笔记 mysql笔记 mysql笔记 mysql笔记 mysql笔记

    MySQL数据库查询优化

    第3课 查询优化技术理论与MySQL实践(一)------子查询的优化(一) 第4课 查询优化技术理论与MySQL实践(二)------子查询的优化(二) 从理论看,子查询包括的内容和范围,建立清晰的概念 从实践看,MySQL的子查询...

    Mysql优化笔记包括网盘视频教程

    这份"Mysql优化笔记"的资源,结合了网盘视频教程,为学习者提供了全面而深入的学习材料,旨在帮助那些希望在MySQL优化领域深化理解的人。 首先,MySQL优化主要分为几个核心部分: 1. **SQL查询优化**:这是最基本...

    MySQL优化笔记-整理版

    里面结合了我整理的笔记希望对大家有用,请大家多多支持

    MySQL优化学习思维笔记.xmind

    MySQL优化学习思维笔记.xmind

    MySQL优化文档笔记

    MySQL优化是数据库管理中至关重要的任务,涉及到多个层面,包括SQL语句的编写、系统配置、存储引擎选择以及数据类型优化等。以下是对这些关键点的详细解释: 首先,MySQL Server的核心组件包括连接器、分析器、优化...

    sql查询优化(提高MySQL数据库查询效率的几个技巧)

    * 优化 SQL 语句:使用 EXPLAIN 语句来分析 SQL 语句的执行计划,优化查询语句。 * 使用存储过程:使用存储过程可以将频繁查询的操作封装起来,提高查询效率。 * 优化数据库结构:优化数据库结构,例如,使用合适的...

    Mysql数据库优化笔记(细节决定成败)

    对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] c: 分表技术(水平分割、垂直分割) d: 读写[写: update/...

    大神写的MySQL DBA学习笔记

    6. **性能优化**:分析SQL查询性能,使用EXPLAIN分析执行计划,调整索引策略,优化数据库架构以提升系统整体性能。 7. **复制与集群**:理解MySQL的复制机制,如何设置主从复制以实现高可用性,以及MySQL Cluster的...

    韩顺平mysql优化笔记.doc

    韩顺平mysql优化笔记.doc Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] c: 分表...

    MySQL性能优化笔记

    ### MySQL性能优化笔记 #### 一、MySQL体系结构与索引实现 - **MySQL体系结构简介**:MySQL作为一款广泛使用的开源关系型数据库管理系统,其内部结构被设计为客户端/服务器架构,支持多种存储引擎。其中最为人所...

    千金良方:MySQL性能优化金字塔法则.docx

    MySQL性能优化是指通过调整MySQL数据库的配置、优化数据库结构和查询语句等方式,提高MySQL数据库的性能和响应速度,以满足应用程序的需求。MySQL作为最流行的开源数据库之一,被广泛应用于各种规模的企业和应用程序...

    Mysql\学习笔记\mysql优化

    MySQL优化是数据库管理中至关重要的一个环节,目的是提高查询速度,减少资源消耗,进而提升整体系统性能。本文主要从数据库设计的三个范式和SQL优化技巧两个方面进行讲解。 首先,我们来了解一下数据库设计的三个...

    韩顺平 大型门户网站核心技术-Mysql优化-笔记-www.itmuch.com.pdf

    在阅读了《韩顺平 大型门户网站核心技术-Mysql优化-笔记***.pdf》文档之后,可以了解到关于MySQL数据库优化的多个关键技术和方法。以下是根据文档内容总结的知识点: 1. MySQL数据库优化技术主要包含以下方面: - ...

    2.mysql查询性能优化1

    MySQL 查询优化可以从多方面入手,包括优化查询语句、优化索引、优化数据库结构等。 6.2 查询优化技术 MySQL 查询优化技术有很多,包括使用索引、优化查询语句、使用连接优化、使用缓存优化等。 6.2.1 使用索引 ...

    尚硅谷mysql笔记.zip

    尚硅谷的MySQL笔记可能是为了帮助学习者深入理解和掌握MySQL的相关知识而编写的。这份笔记可能包含了从基础概念到高级特性的全面讲解,包括但不限于SQL语言、数据类型、数据库设计、索引、事务处理、视图、存储过程...

Global site tag (gtag.js) - Google Analytics