mysql查询优化

mysql查询优化,mysql,query-optimization,Mysql,Query Optimization,我有这个数据库: Tab1---1:n--->tab2(父->id)(max1:4)-复杂零件 Tab1---1:n--->tab3(父->id)-简单连接 表1 id 名称 版本 ……等等 表2 id 家长 类型 价格 ……等等 表3 id 家长 类型 资料 我想从这3个联接表中选择完整的信息集,但我需要使用许多可变条件,因此我需要尽可能地提出最佳解决方案 我使用这个查询: SELECT tab1.id, CONCAT(tab1.name,' ',tab1.version) AS nv, nd

我有这个数据库:

Tab1---1:n--->tab2(父->id)(max1:4)-复杂零件

Tab1---1:n--->tab3(父->id)-简单连接

表1 id
名称
版本
……等等

表2 id
家长
类型
价格
……等等

表3 id
家长
类型
资料

我想从这3个联接表中选择完整的信息集,但我需要使用许多可变条件,因此我需要尽可能地提出最佳解决方案

我使用这个查询:

SELECT tab1.id, CONCAT(tab1.name,' ',tab1.version) AS nv, ndvar.price, tab3.data,
ndvar.v1  
[more columns] 
FROM tab1 INNER JOIN ( 
SELECT parent, 
type, 
GROUP_CONCAT(type SEPARATOR '') + '' AS v1,  
MIN(price) AS price  
[more columns]  
FROM tab2  
WHERE show = 1  
[more condition]  
GROUP BY parent  
HAVING type IN (2,3) [1-3 parameters]  
)  
AS ndvar  
ON tab1.id = ndvar.parent  
LEFT JOIN content  
ON tab1.id = tab3.parent AND tab3.type = 0   
WHERE name LIKE '%xyz%'  
[more conditions]  
ORDER BY nv  
我尽量使它简单易懂

我的问题是: 1) 如何尽可能快地优化此查询以获得if 2) 哪些列用作索引?目前它只是“id”列

tab2中的“type”列包含值0-3,对于每个id,只有该类型的行,因此可以按索引进行查询,但我不知道它是否会对我的查询做出任何改进

提前谢谢

编辑: 这是在在线目录中搜索时使用的查询,在一个月内只有很少的插入或更新,但每天都有许多搜索。 tab1大约有数百条记录,tab2大约有tab1*4条记录,tab3大约有tab1*15条记录。 有许多搜索条件,主要涉及tab1(1-15个参数)和tab2(3个参数)。 除了名称和版本之外,所有参数都是数字(双精度),它们是name-varchar(25)和version-varchar(20)

该查询将在mysql 5.0.70数据库引擎MyISAM上执行

根据我掌握的所有统计数据,搜索tab2.price range和tab2.type是最常见的,搜索其他数字范围比搜索tab1.name或tab1.version更常见

我将很乐意填写任何人将要询问的任何其他信息

顺便说一句:对不起,我语法不好,英语不是我的母语:)

编辑2: 我可能会误解整个“拥有”的概念。 在v1中,我需要为tab1中的每个父级存储tab2行中的整组值,但我需要按tab2.type筛选它们。。怎么做

编辑3: 这种类型的聚合返回的正是我所需要的,但是-我知道它糟糕的解决方案,有人知道如何改进它

 GROUP BY parent 
 HAVING v1 LIKE  '%0%

Tab2.type和tab1.id、Tab2.parent和tab3.parent可能是最重要的索引行,如果它们标识非常特定的行的话

至于索引,其他可能有用的是tab2.price和tab3.type

通常情况下,条件从结果中排除的行越多,就越需要索引

“其中,像“%stuff%”这样的名称可能是世界上最糟糕的条件之一(尽管是最常见的条件之一),因为传统索引什么都不做。如果该测试从结果中删除了很多行(意味着它测试了很多行,只有少数行通过了该条件),那么您应该使用全文索引


内部联接后的子选择可能会影响性能,因为它必须构建一个结果集。

您在组织问题方面做得很好。但这是一个相当复杂的问题,缺少很多信息。我希望看到确切的create table语句、表内内容的描述以及整个查询和查询的目的。我还需要知道您使用的是什么MySql后端数据库以及表的性质——即,是插入重还是更新重。这可能会导致一个很大的问题:/