3

嗨,我知道有很多主题专门用于查询优化策略,但是这个主题太具体了,我无法在 Internet 上的任何地方找到答案。

我在 eshop 中有很大的产品表(大约 180k 行),该表有 65 列。是的,是的,我知道很多,但我在那里存储有关书籍、dvd、蓝光和游戏的信息。

我仍然没有考虑在查询中使用很多列,但是选择仍然很棘手。有很多条件需要考虑和比较。下方查询

SELECT *
FROM products
WHERE production = 1 
AND publish_on < '2012-10-23 11:10:06' 
AND publish_off > '2012-10-23 11:10:06' 
AND price_vat > '0.5' 
AND ean <> ''
AND publisher LIKE '%Johnny Cash%'
ORDER BY bought DESC, datec DESC, quantity_storage1 DESC, quantity_storege2 DESC, quantity_storage3 DESC
LIMIT 0, 20

我已经尝试在 where 子句中的 cols 甚至按子句的 order by 子句中一一放置索引,然后我尝试在 (production, publish_on, publish_off, price_vat, ean) 上创建复合索引。

查询仍然很慢(几秒钟),它需要很快,因为它的 eshop 解决方案和人们因为没有快速得到结果而离开。而且我仍然没有计算需要执行搜索所有找到的行以便进行分页的时间。

我的意思是,让它快速的最好方法是简化查询,但在这种情况下,所有的条件和排序都是必须的。

任何人都可以帮助解决此类问题吗?是否有可能加快这种查询速度,或者有没有其他方法可以简化查询并将其余部分留在 php 引擎上对结果进行排序。

哦,我真的对此一无所知..请分享您的智慧...

提前谢谢了

4

2 回答 2

6

首先确定你要选择什么并删除'*'

Select * from

有更具体的东西

Select id, name, ....

您的表中没有加入或其他任何内容,因此我认为加速选项非常小。

  1. 检查您的 mysql 服务器是否可以使用足够的内存。在你的 my.cnf 中查看这个 confis

    • key_buffer_size = 384M;
    • myisam_sort_buffer_size = 64M;
    • thread_cache_size = 8;
    • query_cache_size = 64M
  2. 看看最大允许并发。mysql推荐CPU的*2

    线程并发 = 4

  3. 您应该真正考虑根据您使用的信息和标准规范化来拆分表格。如果可能的话。

  4. 如果它是一个无法拆分表的高效系统,那么请考虑使用缓存服务器。但这只有在您有很多相同的重复查询时才会有所帮助。

这就是我对底层实现或系统一无所知时会做的事情。

编辑:使尽可能多的列可索引不一定会加快您的系统。索引越多≠速度越快。

于 2012-10-24T12:23:32.070 回答
0

谢谢大家的好评。。

我发现解决方案可能是因为我能够将查询时间从 2.8 秒减少到 0.3 秒。

解决方案:SELECT *在大表(65cols)上使用真的很天真,所以我意识到我只需要在页面上使用其中的 25 个 - 其他可以在产品页面本身上轻松使用。

我还稍微重新索引了我的表。我创建了复合索引

生产,publish_on,publish_off,price_vat,ean

然后我创建了另一个专门用于搜索,包括 cols

标题,出版商,作者

我做的最后一件事是使用查询

SELECT SQL_CALC_FOUND_ROWS ID, title, alias, url, type, preorder, subdescription,....

这使我可以使用更快地计算受影响的行

mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0)

在 mysql_query() 之后...但是我无法理解它如何更快,因为 EXPLAIN EXTENDED 表示查询没有使用任何索引,它仍然比计算单个查询中的行数快 0​​.5 秒。

它似乎工作得很好。如果没有 order by 子句,那将很快变得邪恶,但那是我没有影响的事情。

仍然需要检查我的服务器设置...

谢谢大家的帮助。。

于 2012-10-25T08:53:25.417 回答