我有一个包含数百万行的mysql表
这就是信息
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
dob date NOT NULL,
name VARCHAR(32) NOT NULL,
age VARCHAR(2) NOT NULL,
country VARCHAR(25) NOT NULL,
phone VARCHAR(32) NOT NULL,
city VARCHAR(32) NOT NULL,
comment tinytext NOT NULL,
使用此查询的搜索引擎我想做什么
SELECT * FROM dbname
WHERE name LIKE '%$var%'
AND ( age = '$age'
AND phone = '$phone'
AND country = '$country'
AND city = '$city')
这个查询对性能有好处吗?或者我应该使用什么? ..正如我之前所说,表格很大,包含数百万行
每天有太多用户使用此查询
感谢您的建议,
答案 0 :(得分:0)
请了解'数据库'之间的技术差异和'表'。大多数讨论都是关于表格,而不是数据库'。 (A'数据库'是'表的集合;'表'包含行和列中的数据。)
标准化或缩写country
。两个字母的代码很好。然后声明列
country CHAR(2) CHARACTER SET ascii
age VARCHAR...
?使用TINYINT UNSIGNED
,它要小得多。或者......计算它,因为你有dob
。
TINYTEXT
有一些微妙的问题;使用等效的VARCHAR(255)
。
出生日期被视为敏感信息;重新考虑你是否应该收集和储存这些。
"数百万行"没有资格作为“巨大的”'。但是你需要一个索引。
带有前导通配符的 LIKE
无法使用索引,因此我将忽略处理name
的过滤器。
您还有4个其他列AND
d在一起 - 任何一个或所有列中的单个索引都非常有用。
由于phone
可能非常具有选择性,因此您可以使用简单的
INDEX(phone)
并且SELECT
运行得非常快。
此表和查询的任何形式的分区或分片都不需要,也没有性能优势。