2.MySQL优化Optimizing MyISAM Queries

介绍

以下内容可以提高MyISAM数据插入效率:

  • 对于MyISAM引擎的表,你可以在查询的时候使用并发插入,你只要保证在数据文件的中间没有删除的记录。

  • 通过一些额外的工作,当表具有许多索引时,可以使表LOAD DATA INFILE更快地 运行 MyISAM。使用以下过程:

    1. 执行FLUSH TABLES 语句或mysqladmin flush-tables命令。
    2. 使用myisamchk --keys-used = 0 -rq /path/to/db/tbl_name 删除表的所有索引使用。
    3. 使用LOAD DATA INFILE插入数据,不会更新索引,所以导入很快。
    4. 假如表不会再次进行更新,可以使用myisampack进行压缩。
    5. 使用myisamchk -rq /path/to/db/tbl_name重新创建索引。这会在将内容写入磁盘之前在内存中创建索引树,这比LOAD DATA INFILE同时更新索引要快得多,因为它避免了大量的磁盘搜索。生成的索引树也完美平衡。
    6. 执行FLUSH TABLES 语句或mysqladmin flush-tables命令。

    如果LOAD DATA INFILE插入的是空表,则会自动执行上述优化。自动优化和明确使用过程之间的主要区别在于,您可以让myisamchk为索引创建分配比临时内存更多的内存,而不是服务器在执行LOAD DATA INFILE语句时为索引重新创建分配的内存。

    您还可以MyISAM使用以下语句而不是myisamchk禁用或启用表的非唯一索引 。如果您使用这些语句,则可以跳过 FLUSH TABLES操作:

      ALTER TABLE tbl_name DISABLE KEYS;
      ALTER TABLE tbl_name ENABLE KEYS;
    
  • 要加快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插入所有需要数据则不需要显示执行LOCK语句。

Locking还可以减低多个连接测试的总时间,虽然单个连接的最长等待时间可能会因为等待锁定而上升。假如有5个客户端执行插入:

  • 连接1执行1000次插入
  • 连接2,3和4进行1次插入
  • 连接5执行1000次插入

如果不使用锁定,则连接2,3和4在1和5之前完成。如果使用锁定,则连接2,3和4可能在1或5之前未完成,但总时间应可以快40%。

INSERT, UPDATE和 DELETE 在MySQL里是很快的,但是,通过在所有执行超过五个连续插入或更新操作的内容周围添加锁,可以获得更好的总体性能。假如你在进行大量的连续插入,可以在LOCK TABLES之后定期执行 UNLOCK TABLES (插入1000条或者类似条件),短暂的释放锁,让其他线程执行。 这仍然会带来不错的性能提升。

为了提高性能MyISAM 表,对于 LOAD DATA INFILE和INSERT,通过增加放大键缓存 key_buffer_size系统变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值