What are the current differences between MyISAM and InnoDB storage engines specifically in MySQL 5.7?

4.1k views Asked by At

I saw so many questions and answers on this topic MyISAM vs InnoDB on stackoverflow itself.

But, all of the questions and answers are too old and not related to the current stable version of MySQL 5.7.x

By the time so much development must have been done in both MyISAM and InnoDB.

So, I need those differences available presently with version 5.7.x

So, please don't mark my question duplicate and someone please explain the differences these storage engines have currently as well as the differences they have since past.

Also, please explain at what situation which storage engine should be chosen for a table.

Can different tables belonging to the same schema have different storage engines i.e. few tables will have InnoDB and few ones will have MyISAM.

If yes, then how the JOIN queries would get execute between tables with MyISAM and InnoDB?

Is it true that MySQL is going to remove MyISAM storage engine from the future version?

2

There are 2 answers

0
Bill Karwin On BEST ANSWER

Your assumption that MyISAM has been receiving new development is not correct. MyISAM is not receiving any significant new development. MySQL is clearly moving in the direction of phasing out MyISAM, and using MyISAM is discouraged.

Oracle Corp. has not announced any specific date or version by which they will remove MyISAM. My guess is that MyISAM will never be fully removed, because there are too many sites that wouldn't be able to upgrade, without doing expensive testing to make sure their specific app won't experience any regression issues by converting to InnoDB.

But you might notice that in the MySQL 5.7 manual, the section on MyISAM has been demoted to Alternative Storage Engines, which should be a clue that it's receiving less priority.

In MySQL 5.7, MyISAM is still used for some of the system tables, like mysql.user, mysql.db, etc. But new system tables introduced in 5.6 and 5.7 are InnoDB. All system tables are InnoDB in MySQL 8.0.

MyISAM still does not support any of the properties of ACID. There are no transactions, no consistency features, and no durable writes. See my answer to MyISAM versus InnoDB.

MyISAM still does not support foreign keys, for what it's worth. But I seldom see real production sites using foreign keys even with InnoDB.

MyISAM supports only table-level locking (except for some INSERT appending to the end of a table, as noted in the manual).

MySQL 5.7 supports both fulltext indexes and spatial indexes in both MyISAM and InnoDB. These features are not reasons to continue using MyISAM as they once were.

Both logical backup tools like mysqldump and physical backup tools like Percona XtraBackup can't back up MyISAM tables without acquiring a global lock.

You asked if you could create a variety of tables with different storage engines in the same schema. Yes, you can, and this is the same as it has been for many versions of MySQL.

You asked if you can join tables of different storage engines (by the way, tables don't need to be in the same schema to be joined). Yes, you can join such tables, MySQL takes care of all the details. This is the same as it has been for many versions of MySQL.

But some weird cases can come up when you do this, like what if you update a MyISAM table and an InnoDB table in a transaction, and then roll back? The changes in the InnoDB table are rolled back, but the changes in the MyISAM table are not rolled back, so your data integrity can be broken if you aren't careful. This is also the same as it has been for many versions of MySQL.

Cases where MyISAM has an advantage over InnoDB is a short list, and it's getting shorter.

  • Some table-scan queries and bulk inserts are faster in MyISAM. InnoDB is better at indexed searches.

  • MyISAM may use less storage space than the equivalent data stored in an uncompressed InnoDB table. You can further compact MyISAM tables with myisampack, but this makes the MyISAM table read-only.

    There are other options these days for compact storage of data in transactional storage engines, for example InnoDB table compression, or MyRocks.

  • SELECT COUNT(*) FROM MyTable queries (with no WHERE clause) are very fast in MyISAM, because the accurate count of rows is persisted in the MyISAM metadata. InnoDB (or other MVCC implementations) doesn't keep this count persisted, because every transaction viewing the table might "see" a different row count. Only a storage engine that has table-level locking and no transaction isolation like MyISAM, can optimize this case.

  • Auto-increment that numbers independently for each distinct value in another key column. Again, this requires table-level locking, so it's not supported in InnoDB.

    CREATE TABLE MyTable (
      group_id INT NOT NULL,
      seq_id INT NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (group_id, seq_id)
    ) ENGINE=MyISAM;
    
  • It's still easy to move a MyISAM table from server to server, because the .MYD and .MYI files are self-contained. You can kind of do something similar with InnoDB tables, but you have to use the intricate feature of transportable tablespaces. But this easy-to-move-tables quality of MyISAM no longer works in MySQL 8.0, because of their new data dictionary feature.

  • Under certain load, MyISAM might be a better choice for internal_tmp_disk_storage_engine, which defaults to InnoDB in MySQL 5.7. If you run lots of queries that create temp tables on disk (in-memory temp tables won't benefit), it can put a strain on the InnoDB engine. But you'd have to have a high query rate for this to matter, and if your queries create so many temp tables on disk, you should try to optimize the queries differently.

  • MyISAM allows you to set multiple key caches, and define caches for specific tables. But the MyISAM key caches are only for index structures, not for data.

References:

https://www.percona.com/blog/2016/10/11/mysql-8-0-end-myisam/

https://www.percona.com/blog/2017/12/04/internal-temporary-tables-mysql-5-7/

http://jfg-mysql.blogspot.com/2017/08/why-we-still-need-myisam.html

0
Imnotapotato On

I had this question for a job quiz and got it right: (referring the new version):

MyISAM and InnoDB are two different storage engins that handle CRUD operations differently.

  • Locking: When approching a row inside a MyISAM storage engin, all the table will be locked by other sessions until the change is commited, unlike InnoDB, which locks only the specific selected row(/s). The lock is released until the session is commited. Locking a table or a row causes suspention by other sessions that try to interact with the same table or row to prevent wrong data manipulations in the table for example.

  • Transactions: InnoDB supports transactions, unlike MyISAM. Transactions are a colection of 2 or more commands like SELECT, INSERT, UPDATE and DELETE, to a single operation until complishion.

    1. Atomic Operations: When setting a transaction in an InnoDB and the operation is incompleted - it terminates all the changes and restore the DB as it was (all or nothin'), so for example, if in the middle of a transaction there is a syntax error in the code / datatype mismatch or anything that might interupt the bundle of commands to finish its operation - all the changes wont be applied, thanks transactions atomicy. On the other hand, when using an MyISAM storage engin, if a bundle of commands "breaks" (for any reason), the operation stops immediately and all the tables/rows/data that were affected will remain affected, which might cause a corrupt data in the database (...and a headache).

    2. B. Running an operation on MyISAM are set on the spot, whereas InnoDB allows you to use the "ROLLBACK"s to discard any change, which comes best in handy when running transactions.

    3. Transaction Logs: When creating a transaction without a transaction log in between, you can apply any changes on the table/s in the DB, and if the table have a clustered index (for example), the data will have to search where exactly it has to be inserted and only then apply the change. In a case where there is a transaction log in between the DB and the transaction, the changes will be sent to the transaction log first and will set its order in the table before sending the change to the DB - which will be less time consuming. The DB saves logs from all the transactions that were made, which can help to choose to restore any transaction previously made, and recover all changes. When set to a "simple" recovery model- transactions are deleted from the transactions log and wont be able to recover data (used usually on DEV environments). When set to "full" recovery model, all transactions are saved and listed, ready to be restored - this is used usually on production environments which might cause problems like preformance issues - so backing them up and deleting from the server could be a solution. When set to a "bulk-logged" recovery model saved transaction logs only for specific "important" changes and commands (import,export, insert-select, select-into, reorganaizing/rebuilding indexes), and might prevent preformance issues.

  • Foreign keys: MyISAM dosn't use foreign keys, unlike InnoDB. When a table column has a foregin key set to point on an other table column, when any update/delete occures on the pointed table, it will know that the changes have to be applied on the other table pointing at it. This create a some kind of a link between the two table and keep data in sync. Setting tables with FKs might require more effort which might be considered as a disadvantage (?).

  • FULLTEXT indexing: InnoDB doesn't support FULLTEXT indexing in its previous versions - MyISAM does support it. Switching to MyISAM wont be the best solution so just update MySQL to a verion which does support FULLTEXT indexing. FULLTEXT indexing can take texts like titles, comments, ect' - and search it (this should be a better option than the "LIKE" command in this case).

  • Spatial data types: Supported only on InnoDB.

To sum all up, InnoDB will be usually more reliable in terms of data handling, validity & recovery. For newer versions InnoDB will support FULLTEXT indexing for mainly searches - when using older versions with no option to update MySQL, using MyISAM will be great.