I’m laying out my table structure and am trying to make a good educated guess on how to set up the storage engines.
The first field of the table is of integer type with AUTO INCREMENT. Fields 2 to 5 will be about 95% reads, 5% writes (The writes are only INSERT.) Field 6 however will be constantly updated, about 50% reads (SELECT statements) and 50% writes (10% INSERT 90% UPDATE.)
I just read that you can freely mix concurrent INSERT and SELECT statements for a MyISAM table without locks if there are no removed entries from your table http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html. I don’t plan on removing any rows from the table ever.
Would you recommend I break up the table into two different tables. The first table is MYISAM with Fields 1 to 5 (95% read, 5% write) from above. The second table would be innodb and have two fields, the first is the AUTO INCREMENT that is the same as the first field in the first table and the second field is the one that is constantly being updated (50% read 50% write)?
The two insert statements into the different tables are supposed to occur one after the other. But in the rare case that the first INSERT statement goes through, but the second one doesn’t, how can I enforce that the first fields of each table are correctly mapped to eachother?
If the MyISAM table has multiple VARCHAR fields, you may want to convert the table’s row format to FIXED. This could enlarge the MyISAM table and its index file by 80% to 100%, but will provide a 20%-30% increase in Query Performance without changing anything else.
As long as the tables are used in a mutually exclusive way (no JOINs) you should be OK. Why no JOINs between InnoDB and MyISAM? Every query doing JOINs cannot have a mixture of InnoDB and MyISAM or else every SELECT query deteriorates with full tables locks on both the MyISAM and InnoDB tables.
Here are some other posts I made that fully clarify InnoDB vs MyISAM