【发布时间】:2012-08-04 09:42:22
【问题描述】:
我有一张包含 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 不感兴趣,因为它很快就会变得太慢,我需要一种可以轻松扩展的方法。
【问题讨论】:
标签: php mysql scalability