如何查询1800万行?

时间:2014-01-20 14:36:30

标签: mysql sql

我基本上想知道用这么多行查询表的最佳方法是什么?

我猜我在考虑查询之前需要进行一些优化,因为我尝试执行的任何操作都需要大约50秒才能完成?

任何人对如何加快我的表并更快地执行查询有什么想法?

以下是一个示例查询:

SELECT 
    `COMPANY_NAME`, `ZIPCODE`, `ADDRESS`
FROM
    `companies`
WHERE
    replace(`COMPANY_NAME`, ' ', '') = '$area'

这是我的数据库结构

id  int(11) PRIMARY
COMPANY_NAME    varchar(255)
ADDRESS varchar(255)
CITY    varchar(255)
STATE   varchar(255)
ZIPCODE varchar(255)
COUNTRY varchar(255)
WEB_ADDRESS varchar(255)
PHONE_NUMBER    varchar(255)
FAX_NUMBER  varchar(255)
CONTACT_NAME    varchar(255)
TITLE   varchar(255)
GENDER  varchar(255)
EMPLOYEE    varchar(255)
SALES   varchar(255)
MAJOR_DIVISION_DESCRIPTION  text
SIC_2_Code_Description  text
SIC_4_Code  varchar(255)
SIC_4_Code_Description  text    latin1_swedish_ci

我的数据库也是InnoDB

3 个答案:

答案 0 :(得分:3)

您几乎从不查询数据库并使用无索引进行过滤,这是在所有行上执行函数时的情况。你说这需要50秒,但可能会更糟,而且可能很难预测(由于mysql缓存)。

假设您始终执行此查询(并且您需要执行此操作),最好的方法是保留包含内容replace( COMPANY_NAME , ' ', '')的列(使用触发器)并为该列编制索引。然后搜索将是即时的。

答案 1 :(得分:1)

关于查询性能的关键问题是这句话:

WHERE replace(`COMPANY_NAME`, ' ', '') = '$area'

相反,如果你有:

WHERE COMPANY_NAME = '$area'

然后可以使用COMPANY_NAME的索引。但是,因为您的版本在列上使用了一个函数,所以数据库引擎必须执行全表扫描而不是索引查找。

需要更多信息才能解决此问题。一种方法是更新COMPANY_NAME以删除空格并在其上添加索引。另一个是添加另一列(由@dystroy建议)。如果您只是尝试删除尾随空格,那么您可能希望更新现有列。最后,如果您尝试匹配COMPANY_NAME中的单词而不是整个名称,那么全文索引可能是最佳解决方案。

顺便问一下,你试过这个吗?

WHERE COMPANY_NAME like '$area%'

即,在$area end 处进行通配符搜索。这可以使用COMPANY_NAME上的索引,如果它返回正确的结果,可能是解决问题的最简单方法。

答案 2 :(得分:0)

  1. 将表格重新组织为适当的数据类型(节省空间VARCHAR(255)
  2. 在将用于加入或过滤(COMPANY_NAME
  3. 的任何字段上添加索引
  4. 避免在查询中否定索引和字符串操作,即您的replace语句会否定COMPANY_NAME上的索引并增加运行时。也许您需要添加另一列COMPANY_NAME没有空格的列,或者在上面的查询中修改您的变量。
  5. 在您的情况下,只有少数建议,第二和第三会影响性能。