我有一張擁有250萬名醫生名單的表格。我還提供了接受保險,所用語言和專業(分類學)的表格。醫生表是這樣的:使用各種其他信息對250萬個物品進行索引
CREATE TABLE `doctors` (
`doctor_id` int(10) NOT NULL AUTO_INCREMENT,
`city_id` int(10) NOT NULL DEFAULT '0',
`d_gender` char(1) NOT NULL DEFAULT 'U',
`s_insurance` int(6) NOT NULL DEFAULT '0',
`s_languages` int(6) NOT NULL DEFAULT '0',
`s_taxonomy` int(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`doctor_id`)
) ENGINE=InnoDB;
其他信息被存儲爲這樣:
CREATE TABLE `doctors_insurance` (
`assoc_id` int(10) NOT NULL AUTO_INCREMENT,
`doctor_id` int(10) NOT NULL DEFAULT '0',
`insurance_id` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`assoc_id`)
) ENGINE=InnoDB;
CREATE TABLE `doctors_languages` (
`assoc_id` int(10) NOT NULL AUTO_INCREMENT,
`doctor_id` int(10) NOT NULL DEFAULT '0',
`language_id` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`assoc_id`)
) ENGINE=InnoDB;
CREATE TABLE `doctors_taxonomy` (
`assoc_id` int(10) NOT NULL AUTO_INCREMENT,
`doctor_id` int(10) NOT NULL DEFAULT '0',
`taxonomy_id` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`assoc_id`)
) ENGINE=InnoDB;
當然每個醫生支持各種不同的保險計劃,也許會講多國語言,有的醫生可以有幾種不同的特色(分類)。所以我選擇了用於索引的單獨表格,這種方式需要添加新索引或刪除舊索引,我可以簡單地刪除這些表格,而不必等待很長時間才能以舊式的方式實現。
也因爲其他縮放技術在未來考慮,經典JOIN對我現在沒有什麼影響,所以我並不擔心它。
索引的名字很簡單:
CREATE TABLE `indices_doctors_names` (
`ref_id` int(10) NOT NULL AUTO_INCREMENT,
`doctor_id` int(10) NOT NULL DEFAULT '0',
`practice_id` int(10) NOT NULL DEFAULT '0',
`name` varchar(120) NOT NULL DEFAULT '',
PRIMARY KEY (`ref_id`),
KEY `name` (`name`)
) ENGINE=InnoDB;
然而,當我想要讓人們在城市,特色菜,保險,語言,性別和其他人口統計數據進行搜索,我創造了他:
CREATE TABLE `indices_doctors_demos` (
`ref_id` int(10) NOT NULL AUTO_INCREMENT,
`doctor_id` int(10) NOT NULL DEFAULT '0',
`city_id` int(10) NOT NULL DEFAULT '0',
`taxonomy_id` int(6) NOT NULL DEFAULT '0',
`insurance_id` int(6) NOT NULL DEFAULT '0',
`language_id` int(6) NOT NULL DEFAULT '0',
`gender_id` char(1) NOT NULL DEFAULT 'U',
PRIMARY KEY (`ref_id`),
KEY `index` (`city_id`,`taxonomy_id`,`insurance_id`,`language_id`,`gender_id`)
) ENGINE=InnoDB;
這個想法是,主要針對專業,保險或語言的每個變化都會有一個條目,儘管其他條目仍然是一樣的。這造成了一個明顯的問題。如果醫生有3個專業,支持3個保險提供者,並且會講3種語言,則僅此一項就意味着這位特定的醫生有27個條目。因此,250萬條條目容易形成更多。
必須有更好的方法來做到這一點,但它怎麼做呢?再一次,我對轉向傳統索引技術和使用JOIN不感興趣,因爲它會很快變得太慢,我需要一種可以輕鬆擴展的方法。