在php页面中优化大数据

时间:2012-10-21 02:06:15

标签: php mysql sql large-data

我正在努力加快查询200K行数据并将其显示在网页中的时间,通常需要大约20-30秒,但目前我已将其降低到7-10左右秒。我仍然需要最多3-7秒左右。

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

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

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

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

P.S。:我也在2天左右处理了系统,所以我仍然熟悉这个结构。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  1. 使用与数据库的持久连接以避免连接开销。

  2. 检查所有表在具有高基数的列上是否有PRIMARY KEY(许多行与键值匹配)。好吧,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'和col2 ='bbb';

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

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

  10. 如果您的列数太多,请不要拆分表格。在访问行时,最大的性能影响是找到行的第一个字节所需的磁盘搜索。

  11. 了解更多信息,请访问:

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