mysql查询速度慢。有什么建议吗?

mysql查询速度慢。有什么建议吗?,sql,mysql,optimization,Sql,Mysql,Optimization,我有以下问题。。。它可以工作,但运行速度非常慢。希望有人能给我一些建议来提高执行时间 SELECT tb_clients.*, tb_clients_phone_fax.* FROM tb_clients, tb_clients_phone_fax WHERE tb_clients.client_id=tb_clients_phone_fax.client_id AND MATCH (client_company,client_description,client_keywords) AGAIN

我有以下问题。。。它可以工作,但运行速度非常慢。希望有人能给我一些建议来提高执行时间

SELECT tb_clients.*, tb_clients_phone_fax.*
FROM tb_clients, tb_clients_phone_fax
WHERE tb_clients.client_id=tb_clients_phone_fax.client_id
AND MATCH (client_company,client_description,client_keywords) AGAINST ('test') > 0
AND CONCAT(client_address,' ',client_city,', ',client_state,' ',client_zip) LIKE '%brooklyn%'
LIMIT 10;
编辑:

以下是表格信息:

CREATE TABLE `tb_clients` (
  `client_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `client_company` varchar(254) NOT NULL,
  `client_address` varchar(254) NOT NULL,
  `client_street` varchar(254) NOT NULL,
  `client_city` varchar(254) NOT NULL,
  `client_state` varchar(254) NOT NULL,
  `client_zip` varchar(45) NOT NULL,
  `client_email` varchar(254) NOT NULL,
  `client_website` varchar(254) NOT NULL,
  `client_description` text NOT NULL,
  `client_keywords` text NOT NULL,
  PRIMARY KEY (`client_id`) USING BTREE,
  FULLTEXT KEY `client_company` (`client_company`,`client_description`,`client_keywords`)
) ENGINE=MyISAM AUTO_INCREMENT=68347 DEFAULT CHARSET=latin1;


tb_clients.client_id和tb_clients\u phone\u fax.client_id应编入索引

但是主要的问题似乎是两个字符串的比较,匹配等等。你确定这附近没有其他战争吗?比如,在执行like语句之前避免连接所有地址字段


更新:似乎tb\u客户端\u电话\u传真。客户端\u id未编入索引,如果编入索引,将提高性能。

tb\u客户端。客户端\u id和tb\u客户端\u电话\u传真。客户端\u id应编入索引

但是主要的问题似乎是两个字符串的比较,匹配等等。你确定这附近没有其他战争吗?比如,在执行like语句之前避免连接所有地址字段


更新:似乎tb\u clients\u phone\u fax.client\u id没有索引,如果索引了,会提高性能。

如果没有看到表模式,很难确定,但我认为这是因为您没有搜索任何索引

尝试查看MySQL全文搜索手册:
为了获得更好的答案,您很可能需要发布您的模式和标记。

如果没有看到表模式,很难确定,但我认为这是因为您没有搜索任何标记

尝试查看MySQL全文搜索手册:
为了得到更好的答案,您很可能需要发布您的模式和标识。

您应该首先确保
tbu客户机
有一个
客户机id
索引,
tbu客户机电话传真
有一个
客户机id
索引

然后尝试为客户公司、客户描述、客户关键字添加索引


然而,我敢打赌,对于您在连接的
客户地址、客户城市、客户州、客户邮政编码上所做的比较来说,主要的慢下来了,所以请尝试找到其他方法来进行比较,而不必使用concat。是否可以向表中添加一个字段,用于保存连接的项目的数据,然后仅对该字段进行比较?(丑陋的我知道)

你应该首先确保
tbu客户机
有一个
客户机id
的索引,
tbu客户机电话传真
有一个
客户机id
的索引

然后尝试为客户公司、客户描述、客户关键字添加索引


然而,我敢打赌,对于您在连接的
客户地址、客户城市、客户州、客户邮政编码上所做的比较来说,主要的慢下来了,所以请尝试找到其他方法来进行比较,而不必使用concat。是否可以向表中添加一个字段,用于保存连接的项目的数据,然后仅对该字段进行比较?(我知道很难看)

我对您的情况一无所知,除了前面提到的索引之外,我的第一个想法是:这两个表中有多少行?其中一个只有几千,而另一个只有一千万?假设您的查询性能不是由于加入了非常大的数据集,那么:

正如其他人所说,检查列是否已编制索引。另外,为什么不对要连接的列进行全文索引,然后在查询中对()使用第二个匹配()而不是CONCAT()之类的

更新代码以检查(比如)邮政编码模式,然后相应地编写查询,怎么样?或者,比方说,如果它不是邮政编码模式,那么就不用麻烦搜索那一列

在需要搜索整个(大型)表的大容量情况下,有一件事对我来说非常有效,那就是创建一个包含整个表的串联的列。我在该列上放置了一个全文索引,并对()使用MATCH(),查询速度非常快——以我的经验,全文索引完成了这项工作


现在,如果您确实有一个非常大的表,那么实时加入可能是不可接受的。在这一点上,您有一些选择,但所有这些都是在后台连接并存储结果以获得最终用户体验的变体。

我对您的情况一无所知,除了前面提到的索引之外,我的第一个想法是:这两个表中有多少行?其中一个只有几千,而另一个只有一千万?假设您的查询性能不是由于加入了非常大的数据集,那么:

正如其他人所说,检查列是否已编制索引。另外,为什么不对要连接的列进行全文索引,然后在查询中对()使用第二个匹配()而不是CONCAT()之类的

更新代码以检查(比如)邮政编码模式,然后相应地编写查询,怎么样?或者,比方说,如果它不是邮政编码模式,那么就不用麻烦搜索那一列

在需要搜索整个(大型)表的大容量情况下,有一件事对我来说非常有效,那就是创建一个包含整个表的串联的列。我在该列上放置了一个全文索引,并对()使用MATCH(),查询速度非常快——以我的经验,全文索引完成了这项工作


现在,如果您确实有一个非常大的表,那么实时加入可能是不可接受的。此时,您有几个选项,但所有选项都是在后台加入并存储结果以获得最终用户体验的变体。

我将为表tb_客户端创建一个视图,该表中有一个“假”列,其中包含连接的信息

此外,我将为前面提到的id列编制索引

然后您将使用相同的基本查询,替换
CREATE TABLE `tb_clients_phone_fax` (
  `client_phone_fax_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `client_id` int(11) unsigned NOT NULL,
  `client_phone_1` varchar(45) NOT NULL,
  `client_phone_2` varchar(45) NOT NULL,
  `client_phone_3` varchar(45) NOT NULL,
  `client_fax_1` varchar(45) NOT NULL,
  `client_fax_2` varchar(45) NOT NULL,
  `client_fax_3` varchar(45) NOT NULL,
  PRIMARY KEY (`client_phone_fax_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=33944 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CONCAT(client_address,' ',client_city,', ',client_state,' ',client_zip) LIKE '%brooklyn%'