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 を使用することには興味がありません。なぜなら、すぐに遅くなりすぎるからです。簡単にスケールアウトできる方法が必要です。