【问题标题】:optimizing large data in php page优化php页面中的大数据
【发布时间】:2012-10-11 06:04:30
【问题描述】:

我正在尝试加快查询 200K 行数据并将其显示在网页中所需的时间,通常需要大约 20-30 秒,但目前我已将其缩短到大约 7-10秒。我仍然需要它最多运行 3-7 秒。

在我的查询中,我选择了单个表中的所有行并将大约 5 列放入 PHP 脚本中。查询如下:

SELECT * FROM table where company = ? and division = ?;

我只是从我的会话中添加参数。然后我在 .inc 文件中发送查询和参数,inc 运行查询。但它也运行单独的数据分页查询。然后它将比较两个查询以检查两者之间的任何违规行为。然后它将数据放置在新窗口中。

是否有任何已知的算法或技术可以用来加快这个过程?我已经删除了所有垃圾代码并加快了一些功能,但它仍然很慢。

P.S.:我也是 2 天前刚刚处理过系统,所以我还在熟悉结构。

【问题讨论】:

    标签: php mysql sql large-data


    【解决方案1】:
    1. 使用到数据库的持久连接来避免连接开销。

    2. 检查所有表在具有高基数的列上都有主键(许多行与键值匹配)。好吧,gender 列的基数(选择性)低,唯一用户 id 列的基数高,是成为主键的好候选。

    3. 不同表之间的所有引用通常都应使用索引完成(这也意味着它们必须具有相同的数据类型,以便基于相应列的连接更快)。还要检查您经常需要搜索的字段(经常出现在 WHERE、ORDER BY 或 GROUP BY 子句中)是否有索引,但不要添加太多:您可以做的最糟糕的事情是在每个列上添加索引一个表(我还没有看到一个表有超过 5 个索引的表,甚至 20-30 列大)。如果您从不引用比较中的列,则无需索引它。

    4. 在发出 GRANT 语句时使用更简单的权限可以让 MySQL 在客户端执行语句时减少权限检查开销。

    5. 通过将列声明为保留存储在其中的值所需的大小,从而减少每行的 RAM。

    6. 使用最左边的索引前缀 — 在 MySQL 中,您可以在多个列上定义索引,以便该索引的左侧部分可以单独使用,这样您就需要更少的索引。

    7. 当您的索引由许多列组成时,为什么不创建一个简短、合理唯一且已编入索引的哈希列呢?然后您的查询将如下所示: 选择 * 从表 WHERE hash_column = MD5( CONCAT(col1, col2) ) AND col1='aaa' AND col2='bbb';

    8. 考虑在表加载数据后对表运行 ANALYZE TABLE(或命令行中的 myisamchk --analyze),以帮助 MySQL 更好地优化查询。

    9. 尽可能使用 CHAR 类型(而不是 VARCHAR、BLOB 或 TEXT)— 当列的值具有恒定长度时:MD5 哈希(32 个符号)、ICAO 或 IATA 机场代码(4 和 3 个符号)、 BIC 银行代码(3 个符号)等。可以更快地找到 CHAR 列中的数据,而不是可变长度数据类型列中的数据。

    10. 如果列太多,请勿拆分表。在访问一行时,最大的性能损失是查找行的第一个字节所需的磁盘寻道。

    更多信息请访问:

    http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries

    【讨论】:

      【解决方案2】:

      首先,确保该表上有索引。如果您的查询在 where 子句中同时包含 companydivision,则跨字段的复合索引将运行良好。

      其次,不要为分页运行第二个查询!使用limit 子句运行第一个查询,缓存您需要的内容,然后从那里分页。

      【讨论】:

      • 但是每当我设置限制时,它只会显示我限制它的内容,所以如果我将它限制在 1000 条之内,则只会显示 1000 条记录。如果我将其限制为 1000,脚本如何知道如何将页面除以 200k?你说的缓存我需要什么是什么意思?
      • 我做了一些关于缓存的研究,我认为这可能是解决我的问题的好方法。但是我对此表示怀疑,因为数据会定期更新,并且缓存可能不会像往常一样更新。服务器端是否也有缓存?
      • 即使有限制,也可以使用SQL_CALC_FOUND_ROWS - dev.mysql.com/doc/refman/5.0/en/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2011-02-02
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多