我需要在大表上加快特定的mysql查询

时间:2012-10-24 12:10:51

标签: mysql performance select-query

您好我知道有很多主题专门用于查询优化策略,但是这个主题是如此具体,我无法在interenet上找到答案。

我在eshop(appx.180k行)中有大型产品表,该表有65列。是的,我知道它很多,但我存储有关书籍,DVD,蓝光和游戏的信息。

仍然我没有考虑很多cols进入查询,但选择仍然非常棘手。有许多条件需要考虑和比较。查询以下

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引擎上以对结果进行排序..

哦,我真的很无能为力。分享你的智慧,请...

非常感谢提前

2 个答案:

答案 0 :(得分:4)

首先要确定要选择的内容并删除'*'

Select * from

更具体的内容

Select id, name, ....

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

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

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

    thread_concurrency = 4

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

  4. 如果它是一个无法分割表的高效系统,那么请考虑一个缓存服务器。但是,如果你有很多反复出现的查询,这只会有所帮助。

  5. 当我对底层实现或系统一无所知时,我会这样做。

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

答案 1 :(得分:0)

感谢你们所有人的好评......

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

解: 使用SELECT *在大型桌子(65cols)上真的很天真,所以我意识到我在页面上只需要25个 - 其他可以很容易地在产品页面上使用。

我还对我的桌子进行了一些重新索引。我在

上创建了复合索引
  

production,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子句不存在,那么它很快就会变得邪恶,但那是我没有影响的东西。

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

感谢你们所有的帮助......