MySQL可以很好的支持大数据的访问,但一般来说,数据库中的表的更小,更快的查询将被执行它。因此,创建一个表时,为了获得更好的性能,我们可以设置字段的宽度表中尽可能小。例如,定义拉链代码字段时,如果将其设置为char(255),明显增加了不必要的空间数据库。即使使用varchar是不必要的。因为char(字符)可以很好的完成任务。以同样的方式,如果可以的话,我们应该使用MEDIUMINT代替大整数字段定义。
另一种提高效率的方法是尽可能地将字段设置为null,以便在将来执行查询时,数据库不需要比较null值。
对于某些文本字段,如省或性别,我们可以将它们定义为枚举类型。因为在MySQL中,枚举类型被视为数值数据和数值数据的处理比文字快得多。在这种方式中,我们也可以提高数据库的性能。
2。使用连接(join)来代替子查询(子查询)
MySQL支持SQL查询从4.1.this技术可以使用SELECT语句来创建一个列的查询结果,然后用这个结果作为过滤条件在另一个查询。例如,如果我们想删除那些在客户基本信息表没有订单的客户,我们可以使用子查询从销售信息表中提取所有客户的ID,然后把结果主查询。
删除的地方不在(选择CustomerInfo CustomerID CustomerID从salesinfo)
使用子查询可以完成许多同时需要逻辑上许多步骤的SQL操作。同时,它还可以避免交易或表锁定,也很容易写。然而,在某些情况下,子查询可以通过更有效的连接(join)取代..例如,假设我们要拿出所有的用户谁没有订单记录,你可以用下面的查询做:
SELECT * FROM customerinfo,CustomerID没有(选择CustomerID从salesinfo)
如果连接(join)来完成这个查询的速度要快得多。特别是,当salesinfo表索引到CustomerID,性能会更好,而且查询如下:
SELECT * FROM customerinfo左连接salesinfoon customerinfo CustomerID = salesinfo。在salesinfo.customerid CustomerID是空的
连接(连接)更高效,因为MySQL不需要在内存中创建临时表来完成逻辑两步查询。
三.使用工会(工会)取代人工创建的临时表
MySQL支持从4版本的联合查询,可以将两个或两个以上的选择要在查询中使用临时表的查询。在客户的查询会话结束时,临时表会自动删除,以确保数据库的整洁和有效。当我们使用联盟创建查询,我们只需要使用联盟作为一个关键字连接多个SELECT语句。我们应该注意所有SELECT语句中的字段数。
选择的名字,从客户会选择手机的名字,出生日期从作者
联盟
从产品中选择名称、供应商
4。
尽管我们可以使用子查询(子查询),加入(加入)和联盟(联盟)创建各种查询,不是所有的数据库操作就可以完成,只有一个或几个SQL语句。更多的时候,一系列的报表需要完成某项工作,但在这种情况下,整个块的操作变得不确定当一个块中的语句是错误的。想象一下,在同一时间内插入一个相关表的数据,可能会出现这样的情况:第一次成功更新表事故发生后情况突然出现在二表数据库,使操作没有完成,这将导致数据是不完整的,甚至会破坏数据库中的数据。为了避免这种情况,应该使用一个交易,它的功能是,每个语句的语句块操作成功或失败。换句话说,它可以保持数据库中数据的一致性和完整性。事情开始与开始的关键字,并提交关键词结束。之间的SQL操作失败,那么回滚命令可以恢复数据库状态之前的开始。
开始;
插入salesinfo集CustomerID = 14;
更新库存集数量= 11
在'book项目=;
承诺;
事务的另一个重要作用是,当多个用户同时使用同一个数据源时,它可以使用锁定数据库的方式为用户提供一种安全的访问方式,以确保用户的操作不受其他用户的干扰。
5。锁表
虽然交易是一个很好的方式来维护数据库的完整性,因为它的排他性,它有时会影响数据库的性能,特别是在大型应用系统,交易执行时,数据库将被锁定,这样其他用户的请求只能等到交易结束。如果数据库系统只一些用户
事务的影响不会是一个大问题,但是如果同时有成千上万的用户访问数据库系统,例如访问电子商务网站,就会出现更严重的响应延迟。
事实上,在某些情况下我们可以通过锁定表来获得更好的性能。
锁定表库存写入
从库存中选择数量
whereitem = 'book;
…
更新库存集数量= 11
whereitem = 'book;
打开表
在这里,我们用SELECT语句取出初始数据,并通过一些计算更新表中的新值。包含写关键字的锁表语句可以确保在执行解锁表命令之前没有其他插入、更新或删除清单的访问权限。
6。使用外键
锁定表的方法可以保持数据的完整性,但它不保证数据的关联性,我们可以在这个时候使用外键。例如,外键可以保证每一个销售记录指向一个现有的客户。在这里,外键可以地图在CustomerInfo表CustomerID CustomerID在salesinfo表。没有任何记录合法CustomerID将不会被更新或插入salesinfo。
创建表customerinfo
(
CustomerID int不空,
主键(ID)
类型= InnoDB);
创建表salesinfo
(
salesid INT NOT NULL,
CustomerID int不空,
主键(CustomerID,salesid),
外键(ID)引用customerinfo
(ID)在deletecascade
类型= InnoDB);
注意参数删除实例级。此参数可以确保在CustomerInfo表客户记录被删除,在salesinfo表客户相关的所有记录也会被自动删除。如果你想在MySQL中使用外键,一定要记住,表的类型定义为交易安全表InnoDB类型当你创建表。这类型不是MySQL表的默认类型。定义方法是添加型= InnoDB来创建表的语句。如图所示。
7。利用指数
索引是提高数据库性能的常用方法。它使数据库服务器比没有索引的索引更快地检索特定行。尤其是当查询语句包含max(),min()和订货指令,性能提高更为明显。这场应该被索引吗一般来说,该指标应根据这些字段将用于连接,在判断,和秩序。在一个有大量重复值的索引数据库没有现场试。一个枚举类型字段,很多重复的值很可能。例如,省…场customerinfo,不利于建立索引等领域。相反,它也可能会降低数据库的性能,我们可以在创建表的同时创建适当的索引,或者在以后使用索引表或创建索引来创建索引。
全文索引和搜索的支持从版本3.23.23.full文本索引在MySQL的全文型指标,但它只能用于一台MyISAM型。对于一个大的数据库,将数据加载到一个表没有索引,然后使用ALTER TABLE或创建创建索引,将是非常快的但如果将数据加载到表的全文索引,执行过程会很慢。
8。优化查询语句
在大多数情况下,使用索引可以提高查询速度,但如果SQL语句使用不当,指标并不能发挥其应有的作用。以下是应该注意的几个方面。首先,最好是比较领域的同一类型之间的操作。在MySQL 3.23版本,这甚至是一个必要条件。例如,我们不能比较索引的整数字段具有bigint场;然而,作为一个特殊的情况下,我们可以比较他们的时候,CHAR型和VARCHAR类型字段的字段大小是一样的。其次,尽量不要使用函数来对索引字段操作。
例如,当使用yeae()对日期型字段功能,索引不会起作用。所以,下面两个查询的结果是一样的,但前者比后者要快得多。
SELECT * FROM命令在年(订单)<2001;
SELECT * FROM订单,订单<2001-01-01 ;
计算数值字段时也会出现同样的情况:
从库存中选择* 24 / 7 <;
从清单中选择*,金额<24×7;
上述两个查询并返回相同的结果,但以下查询将比以前快多了。第三、搜索字符字段时,我们有时会使用类似关键字和通配符,这是简单的,但在系统性能为代价的。例如,下面的查询将比较每一个表中的记录。
从书中选择*
其中名为mysql
但是,如果更改下面的查询,返回结果是相同的,但是速度要快得多。
从书中选择*
其中名称> =MySQL,名字