Вопрос по mysql – Когда вы должны использовать InnoDB в MySQL?

11

I am rather confused by the hurt-mongering Вот.

Я знаю, как это сделать, см. Ниже, но не знаю, почему? Для чего они?

create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB;


create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no));
@ J-16 SDiZ: Уххх ... ты заметил это в конце первого запроса ?:type=InnoDB Andrew Ensley
ваш пример делает внешние ключи, а не innodb. Вы должны были спросить, для чего нужны внешние ключи. J-16 SDiZ
Что такое "причинение вреда"? Эта статья о том, как восстановиться от непреднамеренной базы данных DROP. Jim Ferrans
Джим Ферранс: Я сослался на предложение: «Если вы не очень опытный программист, вам будет больно». Léo Léopold Hertz 준영

Ваш Ответ

10   ответов
2

я только для таблиц InnoDB, но не для таблиц MyISAM.

12

InnoDB отключен на вашем общем веб-хосте.

это самый простой ответ, и это правда!
К вашему сведению, InnoDB теперь поддерживает полнотекстовый поиск. Кроме того, InnoDB намного быстрее, чем раньше. Таким образом, редко есть какая-либо причина использовать MyISAM больше(which is why InnoDB is now the default engine in MySQL)
1

innodb - это путь. Речь идет не только о производительности, но целостности данных и кислотных транзакций.

ACID транзакции не всегда нужны, поэтому во многих случаях MyISAM очень хорош. Есть разные решения для разных проблем.
3

когда использовать InnoDB вместо MyISAM и когда использовать ограничения внешнего ключа (FK).

Что касается первого вопроса, было много ответов, которые отлично объясняют различия между MyISAM и InnoDB. Я просто повторю, что в цитате tvanfosson из статьи MyISAM лучше подходит для системы с преимущественно чтениями. Это связано с тем, что он использует блокировку на уровне таблицы вместо уровня строки, как InnoDB, поэтому MyISAM также не может обрабатывать высокий параллелизм, а также отсутствующие функции, которые помогают с целостностью данных, такие как транзакции и внешние ключи (опять же, уже упомянутые другими ).

Вам не нужно использовать ограничения FK в вашей модели данных. Если вы знаете, каковы взаимоотношения между вашими таблицами, и в вашем приложении нет ошибок, то вы без проблем обойдетесь без FK.However, using FKs gives you extra insurance at the database layer because then MySQL won't let your application insert bad data based on the constraints that you created.

Если вы не понимаете, зачем использовать первичные ключи (PK), создайте столбец, такой какid_order например ПК изorders Таблица означает, что MySQL не позволит вамINSERT такое же значениеid_order более одного раза, потому что каждая строка в столбце PK должна быть уникальной.

FK будет использоваться для таблицы, которая зависит от другой таблицы, например,order_items будет зависеть отorders (ниже).id_order_items это ПКorder_items и вы могли бы сделатьid_order_items ФК изorders таблица, чтобы установить отношения один ко многим междуorders а такжеorder_items, Точно так же,id_item может быть ФК вorder_items стол и ПК вitems таблица, чтобы установить отношения один ко многим междуorder_items а такжеitems.

** Затем ограничение FK препятствует добавлениюid_item value to theorder_itemstable that isn't in theПредметыtable, or from adding aid_order_itemstoзаказыthat isn't in theтаблица order_items.

Все, что делает FK, - это обеспечивает целостность данных, а также помогает передавать отношения между вашими таблицами другим разработчикам, которые не писали систему (и самим себе спустя месяцы, когда вы забыли!), Но в основном это делается для обеспечения целостности данных. **

Extra credit: so why use transactions?  Ну, вы уже упомянули цитату, которая говорит, что они полезны для банковской системы, но они полезны в большем количестве ситуаций, чем это.

В основном, в реляционной базе данных, особенно если онанормированныйобычная операция, такая как добавление заказа, обновление заказа или удаление заказа, часто затрагивает более 1 таблицы и / или включает в себя более одного оператора SQL. Вы можете даже несколько раз дотронуться до одной и той же таблицы (как в примере ниже). Кстати, операторы языка манипулирования данными (DML) (INSERT/UPDATE/DELETE) задействуйте только одну таблицу за раз.

An example of adding an order:

Я рекомендуюorders стол иorder_items Таблица. Это делает так, вы можете иметь ПК наid_order вorders стол, что означаетid_order не может быть повторен вorders, Без 1-ко-многимorders - order_items отношения, вы должны иметь несколько строк вorders таблица для каждого заказа, который имеет несколько элементов, связанных с ним (вам нужноitems таблица тоже для этой системы электронной коммерции, кстати). В этом примере мы добавим порядок и коснемся 2 таблиц при этом с 4 различнымиINSERT заявления.

(no key constraints for illustration purposes)

-- insert #1
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)

-- insert #2
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)

-- insert #3
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)

-- insert #4
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)

Так что, еслиinsert #1 а такжеinsert #2 запросы выполняются успешно, ноinsert #3 заявление не сделал? В результате вы получили заказ, в котором отсутствовал элемент, и это были бы данные мусора. Если в этом случае вы хотите откатить все запросы, чтобы база данных была в том же состоянии, в котором она находилась до этогоadding the order и затем начните сначала, ну, это именно то, для чего предназначены транзакции. ** Вы группируете запросы, которые вы хотите, чтобы все они выполнялись, или в случае исключения, а затем вообще ни одного, в транзакцию.

Как и ограничения PK / FK, транзакции помогают обеспечить целостность данных. **

Добавление 1 для противопоставления innoDB myIsam, когда мы просто не знаем mySQL и innoDB, мы не можем знать, что есть много механизмов.
1

что InnoDB предлагает блокировку строк, а MyISAM просматривает таблицу. На больших таблицах с большим количеством записей это может сильно повлиять на производительность.

С другой стороны, у таблицы MyISAM более простая структура файлов, копирование и восстановление таблиц на уровне файлов намного проще.

Сколько считается много? одна запись в секунду это много?
@EvanLee Это зависит :) Особенно, сколько данных вы пишете, соответственно, сколько времени занимает операция записи. Но в целом: нет!
+1 за личную перспективу Léo Léopold Hertz 준영
1
16

механизм хранения в MySQL, Их довольно много, и у всех есть свои плюсы и минусы. Самые сильные стороны InnoDB:

Support for transactions (giving you support for the ACID property). Row-level locking. Having a more fine grained locking-mechanism gives you higher concurrency compared to, for instance, MyISAM. Foreign key constraints. Allowing you to let the database ensure the integrity of the state of the database, and the relationships between tables.
2

Эта статья из Database Journal, в котором обсуждается тип таблицы InnoDB в MySQL.

Выдержка:

Last month we looked at the HEAP table type, a table type which runs entirely in memory. This month we look at setting up the InnoDB table type, the type of most interest to serious users. The standard MyISAM table type is ideal for website use, where there are many reads in comparison to writes, and no transactions. Where these conditions do n,ot apply (and besides websites, they do not apply often in the database world), the InnoDB table is likely to be the table type of choice. This article is aimed at users who are familiar with MySQL, but have only used the default MyISAM table type.

Я не буду откладывать на другой вопрос. Сохраняйте надлежащие резервные копии своей базы данных любого типа - и не удаляйте таблицы случайно ;-) - и вы будете в порядке, какой бы тип таблицы вы ни выбрали.

+1 за статью и резервные копии Léo Léopold Hertz 준영
2

InnoDB:

Механизм хранения InnoDB в MySQL.   InnoDB - это высоконадежный и высокопроизводительный механизм хранения для MySQL. Ключевые преимущества InnoDB включают в себя:

Its design follows the ACID model, with transactions featuring commit, rollback, and crash-recovery capabilities to protect user data. Row-level locking (without escalation to coarser granularity locks) and Oracle-style consistent reads increase multi-user concurrency and performance. InnoDB tables arrange your data on disk to optimize common queries based on primary keys. Each InnoDB table has a primary key index called the clustered index that organizes the data to minimize I/O for primary key lookups To maintain data integrity, InnoDB also supports FOREIGN KEY referential-integrity constraints. You can freely mix InnoDB tables with tables from other MySQL storage engines, even within the same statement. For example, you can use a join operation to combine data from InnoDB and MEMORY tables in a single query.

InnoDB Limitations:

No full text indexing (Below-5.6 mysql version)

Cannot be compressed for fast, read-only

More Details:

Отослать этоссылка на сайт

0

Машина а такжеknoopxответ о транзакциях:

The default MySQL table type, MyISAM, does not support transactions. BerkeleyDB and InnoDB are the transaction-safe table types available in open source MySQL, version 3.23.34 and greater.

The definition of the transaction and an banking example

A transaction is a sequence of individual database operations that are grouped together. -- A good example where transactions are useful is in banking.

Источник цитат

Похожие вопросы