我正在努力加快查询200K行数据并将其显示在网页中的时间,通常需要大约20-30秒,但目前我已将其降低到7-10左右秒。我仍然需要最多3-7秒左右。
在我的查询中,我选择单个表中的所有行,并将大约5列放入PHP脚本中。查询如下:
SELECT * FROM table where company = ? and division = ?;
我只是添加会话中的参数。然后我将查询和参数发送到 .inc 文件中, inc 运行查询。但它也运行单独的数据分页查询。然后它将比较2个查询以检查两者之间的任何不规则性。然后它将数据放在一个新窗口中。
我可以使用任何已知的算法或技术来加快这个过程吗?我已经删除了任何垃圾代码并加快了一些功能,但它仍然很慢。
P.S。:我也在2天左右处理了系统,所以我仍然熟悉这个结构。
答案 0 :(得分:1)
首先,确保该表上有索引。如果您的查询在where子句中同时包含company
和division
,则跨字段的复合索引将很有效。
其次,不要为分页运行第二个查询!使用limit
子句运行第一个查询,缓存您需要的内容,然后从那里进行分页。
答案 1 :(得分:1)
使用与数据库的持久连接以避免连接开销。
检查所有表在具有高基数的列上是否有PRIMARY KEY(许多行与键值匹配)。好吧,gender
列具有低基数(选择性),唯一用户ID列具有高基数,并且是成为主键的良好候选者。
不同表之间的所有引用通常应该使用索引(这也意味着它们必须具有相同的数据类型,以便基于相应列的连接更快)。还要检查您经常需要搜索的字段(经常出现在WHERE,ORDER BY或GROUP BY子句中)具有索引,但不要添加太多:您可以做的最糟糕的事情是在每个列上添加索引一张桌子(我没有看到一张桌子上有超过5个索引的桌子,甚至还有20到30个大的桌子)。如果您从未在比较中引用过列,则无需对其进行索引。
在发出GRANT语句时使用更简单的权限,MySQL可以在客户端执行语句时减少权限检查开销。
每行使用较少的RAM,只需将列声明为保存存储在其中的值所需的大小。
使用最左边的索引前缀 - 在MySQL中,您可以在多个列上定义索引,以便该索引的左侧部分可以单独使用,这样您就需要更少的索引。
当您的索引包含许多列时,为什么不创建一个简短,合理唯一且已编入索引的哈希列?然后您的查询将如下所示: 选择 * 从表 WHERE hash_column = MD5(CONCAT(col1,col2)) AND col1 ='aaa'和col2 ='bbb';
在加载数据后,考虑在表上运行ANALYZE TABLE(或myisamchk --analyze from commandze),以帮助MySQL更好地优化查询。
尽可能使用CHAR类型(而不是VARCHAR,BLOB或TEXT) - 当列的值具有恒定长度时:MD5-hash(32个符号),ICAO或IATA机场代码(4和3个符号), BIC银行代码(3个符号)等。可以更快地找到CHAR列中的数据,而不是可变长度数据类型列中的数据。
如果您的列数太多,请不要拆分表格。在访问行时,最大的性能影响是找到行的第一个字节所需的磁盘搜索。
了解更多信息,请访问:
http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries