您好我知道有很多主题专门用于查询优化策略,但是这个主题是如此具体,我无法在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引擎上以对结果进行排序..
哦,我真的很无能为力。分享你的智慧,请...
非常感谢提前
答案 0 :(得分:4)
首先要确定要选择的内容并删除'*'
Select * from
更具体的内容
Select id, name, ....
您的表中没有加入或其他任何内容,因此我认为加速选项非常小。
检查您的mysql Server是否可以使用足够的内存。 看看my.cnf中的这个confis
查看最大允许并发数。 mysql推荐CPU的* 2
thread_concurrency = 4
您应该考虑根据您使用的信息和标准规范化来分割表格。如果可能的话。
如果它是一个无法分割表的高效系统,那么请考虑一个缓存服务器。但是,如果你有很多反复出现的查询,这只会有所帮助。
当我对底层实现或系统一无所知时,我会这样做。
编辑: 尽可能多列可索引的列不一定会加速您的系统。索引越多,速度越快。
答案 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子句不存在,那么它很快就会变得邪恶,但那是我没有影响的东西。
仍然需要检查我的服务器设置......
感谢你们所有的帮助......