我基本上想知道用这么多行查询表的最佳方法是什么?
我猜我在考虑查询之前需要进行一些优化,因为我尝试执行的任何操作都需要大约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
答案 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)
VARCHAR(255)
)COMPANY_NAME
)COMPANY_NAME
上的索引并增加运行时。也许您需要添加另一列COMPANY_NAME
没有空格的列,或者在上面的查询中修改您的变量。在您的情况下,只有少数建议,第二和第三会影响性能。