Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17138
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-18 10:33
文章分类
文章存档

2015年(22)

我的朋友

分类: Mysql/postgreSQL

2015-02-28 19:28:36

    本节列出了一些改善查询处理速度杂项建议:

  • 使用永久连接到数据库以避免连接开销。如果你无法使用永久连接并且你正在发起到数据库许多新的连接,可能要更改thread_cache_size的[585]变量的值。相见 Section 8.11.2, “Tuning Server Parameters” 。

  • 经常检查你所有的查询是否真的使用您的表中创建的索引。在MySQL中,你可以用EXPLAIN语句来做到这一点。详见,Section 8.8.1, “Optimizing Queries with EXPLAIN 。

  • 尽量避免经常更新的MyISAM表上复杂的SELECT查询,避免发生因reader和writer之间的争用表锁定问题。

  • MyISAM支持并发插入:如果一个表有数据文件的中间没有空闲块,可以在同一时间其它线程读取表中INSERT新行进去。如果它是重要的是能够做到这一点,考虑使用该表在避免删除行的方式。另一种可能性是运行OPTIMIZE TABLE进行碎片整理的表在你已经删除了很多行之后。这种行为是通过设置concurrent_insert[497]变量改变。可以强制新行追加(因此,允许并发插入),即使在已删除行的表。详见 ,  
    Section 8.10.3,“Concurrent Inserts” 。

  • 要解决任何压缩的问题可能发生的用ARCHIVE表, 可以使用OPTIMIZE TABLE ,详见Section 14.6, “The ARCHIVE Storage Engine” 。

  • 使用ALTER TABLE ... ORDER BY expr1expr2, ...  如果你平时检索行的expr1,expr2, ...  排序 。通过使用这个选项经过广泛改变到表,你可以得到更高的性能。

  • 在某些情况下,它可能是有意义的介绍是“哈希”的基础上从其他列的信息的一列。如果此列是短的,合理的独特性,和索引,它可以比在许多列的“宽”索引快得多。在MySQL中,这是非常容易使用这个额外列:
    SELECT * FROM tbl_name
        WHERE hash_col=MD5(CONCAT(col1col2))
        AND col1=' constant ' AND col2=' constant ';

  • 对于频繁更改的MyISAM表,尽量避免所有可变长度列(VARCHAR,BLOB和TEXT)。表使用动态行格式如果它包括即使是单个可变长度列。详见,Chapter 14, Storage Engines 。

  • 它通常不是有用的一个表分成不同的表只是因为行变大。在访问行,最大的性能命中是磁盘寻道需要找到该行的第一个字节。找到数据后,大多数现代磁盘可以读取整个行足够快于大多数应用。

  • 如果经常需要基于来自很多行的信息来计算的结果,如计数,可能优选引入一个新的表并实时更新该计数器。以下形式的更新是非常快:
    UPDATE tbl_name SET count_col=count_col +1 WHERE key_col =constant ;

    当你使用MySQL的存储引擎时如MyISAM数据只具有表级锁(单写入多读取),这是非常重要的。这也给了与大多数数据库系统更好的性能,因为在这种情况下,行锁定管理器具有少做。

  • 如果你需要从大的日志表收集统计信息,用汇总表来代替扫描整个日志表。维护摘要应该比尝试计算统计数据“live”要快得多。从日志重新生成新的汇总表 当事情发生改变(取决于业务决策)是比改变运行的应用更快。

  • 如果可能,分类的报告为“live”或“statistical”,那里是从定期从实时数据生成汇总表只需要建立统计报表数据。

  • 取的事实列有默认值的优势。明确地插入值只有当插入的值不同于默认值。这降低了分析的MySQL必须做并提高插入速度.

  • 在某些情况下,可以很方便地包装和存储数据到BLOB列。在这种情况下,你必须提供代码在您的应用程序打包和解包的信息,但是这可能节省了大量的访问在某个阶段。当你有不符合良好于rows-and-columns的表结构的数据,这是现实。

  • 通常情况下,尽量保持所有数据的非冗余(观测什么是指在数据库理论的第三范式)。然而,可能存在在其中可以有利地复制信息或创建汇总表以获得更多的速度的情况。

  • 存储程序或UDFs(用户定义函数)可能是获得了一些任务性能的好办法。更多信息,详见Section 18.2, “Using Stored Routines (Procedures and Functions)”, 和 Section 22.3,“Adding New Functions to MySQL” 。

  • 您可以通过缓存应用程序中的查询或答案并随后执行许多插入或更新一起提高性能。如果你的数据库系统支持表锁(一样的MySQL),这应该有助于确保索引缓存被所有更新后才能刷新一次。还可以利用MySQL的查询缓存来实现类似的效果; 详见,Section 8.9.3, “The MySQL Query Cache” 

  • 使用多行INSERT语句来存储很多行用一个SQL语句。(这是一种相对轻便的技术。)

  • 使用LOAD DATA INFILE加载大量数据。这比使用INSERT语句更快。

  • 使用AUTO_INCREMENT列,以便在表中的每一行可以由一个单一的唯一值来识别。

  • 在同时使用OPTIMIZE TABLE一次,以避免碎片用动态格式MyISAM表。详见,Section 14.3.3, “MyISAM Table Storage Formats”

  • 使用MEMORY表时可能获得更快的速度。详见,Section 14.4, “The MEMORY Storage Engine”。MEMORY表是对于经常访问的非关键数据非常有用,如信息,关于最后显示的横幅谁没有在他们的Web浏览器中启用cookie的用户。用户会话在许多Web应用程序环境的处理挥发性状态数据提供另一种选择。

  • WEB服务器,图像和其他的二进制资产通常应作为文件存储。也就是说,只存储一个参考到文件而不是文件本身在数据库中。大多数Web服务器在缓存文件比数据库内容好,因此使用文件一般要快。

  • 列用在不同的表相同的信息应该被声明为具有相同的数据类型,以便联接基于相应列会更快。

  • 尽量使列名简单。例如,在一个表中命名为customer,使用name列名而不是CUSTOMER_NAME。为了使您的名字移植到其他SQL服务器,请考虑保持他们短于18个字符。

  • 如果你真的需要高速度,看看数据存储的 low-level 接口不同的SQL服务支持。例如,通过直接访问的MySQL MyISAM存储引擎,你可以得到的速度增加二至五倍相比使用SQL接口。

  • 如果使用的是数字数据,它是在许多情况下比访问一个文本文件更快地从数据库中访问信息(使用实时连接)。在数据库中的信息可能被存储在比在文本文件中的更紧凑的格式,所以访问它涉及较少的磁盘访问次数。还可以节省代码在您的应用程序,因为你不必解析文本文件,以查找的行和列的边界。

  • 复制可以对一些操作提供了性能优势。可以复制分发服务器中检索客户端分裂的负荷。为了避免主站缓慢的同时进行备份,你可以使用从站备份。详见,Chapter 16, Replication 

  • 声明一个MyISAM表用DELAY_KEY_WRITE=1表选项使索引更新更快,因为他们没有刷新到磁盘直到表被关闭。缺点是,如果出现杀死该服务器同时这样的表已打开,你必须确保该表是运行--myisam-recover-options [456]服务选项,或重新启动服务器之前运行myisamchk的。(然而,即使在这种情况下,你不应该使用DELAY_KEY_WRITE失去任何东西,因为键信息总是可以从数据行产生。)

  • 当你想给SELECT语句优先级高于你的插入使用INSERT LOW_PRIORITY用于支持非事务表。

  • 使用SELECT HIGH_PRIORITY用于支持非事务表以获取检索插队。即,SELECT执行即使有其他客户端等待做写操作。

    LOW_PRIORITY和HIGH_PRIORITY有一个效果只为非存储引擎在只使用table-level锁。

阅读(145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~