1

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

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

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

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

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

PS:我也是两天前才处理过系统,所以我还在熟悉结构。

4

2 回答 2

2
  1. 使用到数据库的持久连接来避免连接开销。

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

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

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

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

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

  7. 当您的索引由许多列组成时,为什么不创建一个简短、合理唯一且已编入索引的哈希列呢?然后您的查询将如下所示: SELECT * FROM table 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

于 2012-10-21T02:39:54.820 回答
1

首先,确保该表上有一个索引。如果您的查询同时包含companydivision在您的 where 子句中,则跨字段的复合索引会很好地工作。

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

于 2012-10-21T02:08:56.807 回答