MySQL DB оптимизация и производительность: 2 таблицы или 3 таблицы? - PullRequest
0 голосов
/ 15 ноября 2011

Вот две таблицы:

CREATE TABLE `mydatabase`.`members` (
`memberid` VARCHAR( 20 ) NOT NULL ,
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (memberid) 
) ENGINE = MYISAM ;


CREATE TABLE `mydatabase`.`orders` (
`orderid` INT(11)  UNSIGNED NOT NULL AUTO_INCREMENT,
`memberid` VARCHAR( 20 ),
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`info1` VARCHAR( 3200 ) NULL ,
`info2` DECIMAL (6,2) NULL ,
PRIMARY KEY (orderid) ,
FOREIGN KEY (memberid) REFERENCES members(memberid)
) ENGINE = MYISAM;

В БД больше таблиц (поэтому ответ на мой вопрос от экспертов, возможно, может быть иным). Должен ли я разделить заказы на две таблицы, чтобы повысить производительность? Вы видите, что таблицы заказов содержат orderid, memberid и некоторую дополнительную информацию о заказах, которая может быть в третьей отдельной таблице. Имеет ли смысл разделять порядок таблиц, чтобы таблица №2 содержала orderid и memberid, а третья таблица содержала orderid, Time, info1 и info2?

В большинстве случаев, когда запрос выбирает информацию с помощью orderid , он также перепроверяет эту информацию для соответствующего пользователя, проверяя " WHERE memberid = 'abcde' ". Таким образом, только 1 пользователь может видеть информацию из своего заказа, но никто другой. В результате я надеюсь, что сохранение нескольких дополнительных столбцов Time, info1, info2 (и еще нескольких столбцов о заказе) в той же таблице orders в порядке (иначе я должен использовать JOIN в большинстве случаев в большинстве случаев двойная проверка memberid выполняется чаще, и запросы становятся более сложными, хотя таблицы разбиты). Что лучше для производительности: разбить эти таблицы -vs-, используя более простые запросы?

Кстати, я правильно создаю эти 2 таблицы в соответствии с изменениями производительности и здравым смыслом (я спрашиваю о первичных и внешних ключах)? Вы рекомендуете использовать INNODB вместо MYISAM? Если да, я должен использовать ENGINE = INNODB вместо ENGINE = MYISAM для ВСЕХ таблиц в БД?

Спасибо.

1 Ответ

1 голос
/ 15 ноября 2011

InnoDB - это современный движок от MySQL и движок по умолчанию.Используйте его каждый раз, за ​​исключением тех случаев, когда у вас есть веские причины не использовать InnoDB в особых случаях.

Не искажайте макет таблицы по соображениям производительности.Скорее всего, есть и другие способы решения проблем с производительностью - когда вы когда-нибудь попадете в одну ...

Есть несколько причин, по которым я могу подумать, где это имеет смысл, например, если вам нужен FULLTEXT-Index для некоторого столбца, который доступен только с движком MyISAM.Здесь может иметь смысл разделить таблицу, чтобы отделить столбец с необходимым FULLTEXT-индексом.

...