e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> Mssql教程 >> MySQL手册版本 5.0.20-MySQL优化(四) >> 教程正文
 
教程搜索
 
 
相关教程
  • 你知道MySQL10条鲜为人知的技巧吗?
  • 你应该知道的10个MySQL客户启动选项
  • 用特殊的MySQL运算符获得更多数据比较
  • MySQL数据库中与 NULL值有关的几个问题
  • 教你快速了解公共MySQL的数据库服务器
  • MySQL 5.0在windows上的安装详细介绍
  • MySQL查询的性能优化
  • Linux操作系统中如何安装MySQL数据库
  • 23道安全门加铸MySQL数据库
  • MySQL 5.0 数据库新特性的存储过程
  • 从Windows命令行启动MySQL
  • 连接MySQL数据库失败频繁的原因
  • 加速动态网站 MySQL索引分析和优化
  • 轻松掌握如何保护MySQL中的重要数据
  • 快速掌握MySQL数据库中Show命令的用法
  • MySQL数据库的安全配置实用技巧
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
MySQL手册版本 5.0.20-MySQL优化(四)
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9
NDEX 告诉MySQL,做全表扫描的话会比利用给定的索引更浪费资源。详情请看"14.1.7 SELECT Syntax"。

SELECT * FROM t1, t2 FORCE INDEX (index_for_column)

WHERE t1.col_name=t2.col_name;

启动 mysqld 时使用参数 --max-seeks-for-key=1000 或者执行 SET max_seeks_for_key=1000 来告诉优化程序,所有的索引都不会导致超过1000次的索引搜索。请查看章节"5.2.3 Server System Variables"。

7.2.12 加速 INSERT

插入一条记录花费的时间由以下几个因素决定,后面的数字大致表示影响的比例:

连接:(3)

发送查询给服务器:(2)

解析查询:(2)

插入记录:(1 x 记录大小)

插入索引:(1 x 索引数量)

关闭:(1)

这里并没有考虑初始化时打开数据表的开销,因为每次运行查询只会做这么一次。

如果是 B-tree 索引的话,随着索引数量的增加,插入记录的速度以 log N 的比例下降。

可以使用以下几种方法来提高插入速度:

如果要在同一个客户端在同一时间内插入很多记录,可以使用 INSERT 语句附带有多个 VALUES 值。这种做法比使用单一值的 INSERT 语句快多了(在一些情况下比较快)。如果是往一个非空的数据表里增加记录,可以调整变量 bulk_insert_buffer_size 的值使之更快。详情请看"5.2.3 Server System Variables"。

如果要从不同的客户端中插入大量记录,使用 INSERT DELAYED 语句也可以提高速度。详情请看"14.1.4 INSERT Syntax"。

对 MyISAM 而言,可以在 SELECT 语句正在运行时插入记录,只要这时候没有正在删除记录。

想要将一个文本文件加载到数据表中,可以使用 LOAD DATA INFILE。这通常是使用大量 INSERT 语句的20倍。详情请看"14.1.5 LOAD DATA INFILE Syntax"。

通过一些额外的工作,就可能让 LOAD DATA INFILE 在数据表有大量索引的情况下运行的更快。步骤如下:

用 CREATE TABLE 随便创建一个表。

执行 FLUSH TABLES 语句或 mysqladmin flush-tables 命令。

执行 myisamchk --keys-used=0 -rq /path/to/db/tbl_name 命令,删掉数据表的所有索引。

执行 LOAD DATA INFILE,数据插入到表中,由于无需更新表索引,因此这将非常快。

如果将来只是读取改表,运行 myisampack 让数据表变得更小点。详情查看"15.1.3.3 Compressed Table Characteristics"。


运行 myisamchk -r -q /path/to/db/tbl_name 重建索引。创建的索引树在写入磁盘前先保存在内存中,这省去了磁盘搜索,因此速度快多了。重建后的索引树分布非常均衡。

执行 FLUSH TABLES 语句或 mysqladmin flush-tables 命令。

注意,LOAD DATA INFILE 将数据插入一个空表时,也会做前接优化;主要的不同在于:运行 myisamchk 会分配更多的临时内存用于创建索引,而执行 LOAD DATA INFILE 命令则是让数据库服务器分配内存用于重建索引。从 MySQL 4.0 起,可以运行 ALTER TABLE tbl_name DISABLE KEYS 来代替 myisamchk --keys-used=0 -rq /path/to/db/tbl_name,运行 ALTER TABLE tbl_name ENABLE KEYS 代替 myisamchk -r -q /path/to/db/tbl_name。这么做就可以省去 FLUSH TABLES 步骤。

可以在锁表后,一起执行几个语句来加速 INSERT 操作:

LOCK TABLES a WRITE;

INSERT INTO a VALUES (1,23),(2,34),(4,33);

INSERT INTO a VALUES (8,26),(6,29);

UNLOCK TABLES;

这对性能提高的好处在于:直到所有的 INSERT 语句都完成之后,索引缓存一次性刷新到磁盘中。通常情况是,多有少次 INSERT 语句就会有多数次索引缓存刷新到磁盘中的开销。如果能在一个语句中一次性插入多个值的话,显示的锁表操作也就没必要了。对事务表而言,用 BEGIN/COMMIT 代替 LOCK TABLES 来提高速度。锁表也回降低多次连接测试的总时间,尽管每个独立连接为了等待锁的最大等待时间也会增加。例如:

Connection 1 does 1000 inserts

Connections 2, 3, and 4 do 1 insert

Connection 5 does 1000 inserts

如果没有锁表,则连接2,3,4会在1,5之前就做完了。如果锁表了,则连接2,3,4可能在1,5之后才能完成,但是总时间可能只需要40%。MySQL的 INSERT, UPDATE, DELETE 操作都非常快,不过在一个语句中如果有超过5个插入或者更新时最好加锁以得到更好的性能。如果要一次性做很多个插入,最好是在每个循环(大约1000次)的前后加上 LOCK TABLES 和 UNLOCK TABLES,从而让其他进程也能访问数据表;这么做性能依然不错。INSERT 总是比 LOAD DATA INFILE 插入数据来得慢,因为二者的实现策略有着分明的不同。

想要让 MyISAM 表更快,在 LOAD DATA

INFILE 和 INSERT 时都可以增加系统变量 key_buffer_size 的值,详情请看"7.5.2 Tuning Server Parameters"。

7.2.13 加速 UPDATE

UPDATE 语句的优化和 SELECT 一样,只不过它多了额外的写入开销。写入的开销取决于要更新的记录数以及索引数。如果索引没有发生变化,则就无需更新。


另一个提高更新速度的办法是推迟更新并且把很多次更新放在后面一起做。如果锁表了,那么同时做很多次更新比分别做更新来得快多了。

注意,如果是在 MyISAM 表中使用了动态的记录格式,那么记录被更新为更长之后就可能会被拆分。如果经常做这个,那么偶尔做一次 OPTIMIZE TABLE 就显得非常重要了。详情请看"14.5.2.5 OPTIMIZE TABLE Syntax"。

7.2.14 加速 DELETE

删除单个记录的时间和它的索引个数几乎成正比。想更快地删除记录,可以增加索引键的缓存。详情请看"7.5.2 Tuning Server Parameters"。

如果想要删除数据表的所有记录,请使用 TRUNCATE TABLE tbl_name 而不是 DELETE FROM tbl_name。详情请看"14.1.9 TRUNCATE Syntax"。

7.2.15 其他优化点子

本章节列出了一些改善查询处理速度的其他点子:

使用永久连接到数据库,避免连接的开销。如果需要初始化很多连接,而又不能用永久连接,那么可以修改变量 thread_cache_size 的值,详情请看"7.5.2 Tuning Server Parameters"。

总是检查查询是否利用了表中已有的索引。在MySQL中,可以用 EXPLAIN 语句来分析。详情请看"7.2.1 EXPLAIN Syntax (Get Information About a SELECT)"。

尽量不要在经常需要更新的 MyISAM 表上用太过复杂的 SELECT 语句,这是为了避免在读和写之间争夺锁。

在 MyISAM 表中,如果没有正在删除记录,则可以在其他查询正在读取数据的同时插入记录。如果这种情况十分重要,那么就要尽量在表没有删除记录时才使用表。另一个可能的办法就是在删除一大堆记录之后执行 OPTIMIZE TABLE 语句。

如果总是需要按照 expr1, expr2, ... 的顺序取得记录,那么请使用 ALTER TABLE ... ORDER BY expr1, expr2, ... 修改表。通过这种方法扩充修改表之后,就可能获得更高的性能表现。

在一些情况下,让一个字段类型是 ``hashed`` ,它基于其他字段信息。如果这个字段比较短而且基本上都是唯一值的话,那么就可能会比在几个字段上使用一个大索引来得更快,很简单的就能使用这样的额外字段,如下:

SELECT * FROM tbl_name WHERE hash_col=MD5(CONCAT(col1,col2))

AND col1='constant' AND col2='constant';

如果 MyISAM 表经常大量修改,那么要尽量避免修改所有的变长字段(VARCHAR, BLOB,TEXT)。尽管表中只有一个变长字段,它也会采用动态记录格式的。详情请看"15 MySQL Storage Engines and Table Types"。

通常情况下,当数据表记录变 ``大`` 之后,将表拆分成几个不同的表并没有多大用处。访问一条记录是最大的性能点在于磁盘搜索时找到记录的第一个字节上。只要找到记录的位置后,现在的大部分磁盘对于大部分的应用程序

上一页  1 2 3 下一页
  • 上一篇教程: MySQL手册版本 5.0.20-MySQL优化(五)
  • 下一篇教程: 新手入门--全面介绍MySQL的基础应用
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.