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

use*_*510 3 mysql performance select-query

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

我在eshop中有一个大表的产品(约18万行),该表有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
Run Code Online (Sandbox Code Playgroud)

我已经尝试在where子句中甚至逐个order子句中在cols上逐一放置索引,然后我尝试在on上创建复合索引(生产,publish_on,publish_off,price_vat,ean)。

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

我的意思是,使其快速完成的最佳方法是简化查询,但是在这种情况下,必须满足所有条件和排序。

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

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

提前谢谢了

cb0*_*cb0 5

首先请确定您要选择和删除的“ *”

Select * from
Run Code Online (Sandbox Code Playgroud)

有一些更具体的

Select id, name, ....
Run Code Online (Sandbox Code Playgroud)

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

  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

    thread_concurrency = 4

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

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

当根本不了解底层实现或系统时,我将这样做。

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