2017-02-24 77 views
-2

我有一個MySQL表擁有數百萬行搜索引擎龐大的MySQL數據庫 - PHP

的,這是信息

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, 

我想要使用此查詢

做IA搜索引擎
SELECT * FROM dbname 
    WHERE name LIKE '%$var%' 
     AND (age = '$age' 
     AND phone = '$phone' 
     AND country = '$country' 
     AND city = '$city') 

這個查詢對性能有好處嗎?或我應該使用什麼? ..正如我以前說過的表是巨大的,包含數百萬行

和太多的用戶會每天使用這種查詢

感謝諮詢,

+1

嘗試在您的服務器上運行查詢,並親自查看完成所需的時間是否滿足您的要求。如果沒有,請嘗試在其上運行EXPLAIN查詢以獲取更多信息。 – NaeiKinDus

回答

0

請學會「數據庫」之間的技術差異和'桌子'。大部分討論都是關於'表格',而不是'數據庫'。 ('數據庫'是'表格'的集合;'表格'包含行和列的數據。)

標準化或縮寫country。 2個字母的代碼是很好的。然後申報專欄

country CHAR(2) CHARACTER SET ascii 

age VARCHAR... ?? ??使用TINYINT UNSIGNED,它要小得多。或...計算它,因爲你有dob

TINYTEXT有一些微妙的問題;使用等效的VARCHAR(255)

出生日期被視爲敏感信息;重新考慮你是否應該收集和存儲這樣的。

「數百萬行」不符合「巨大」的條件。但是你需要一個索引。

LIKE帶引號的通配符不能使用索引,所以我會忽略處理name的過濾器。

你有4個其他列AND d在一起 - 在任何或所有的單個索引將是非常有用的。

由於phone很可能是非常有選擇性的,你可以有一個簡單的

INDEX(phone) 

SELECT將運行速度非常快。

對於這個表和查詢,沒有必要也沒有任何形式的分區或分片性能優勢。