To create an InnoDB table, specify an
ENGINE=InnoDB option in the
CREATE TABLE statement:
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
An InnoDB table and its indexes can be created
in the system
tablespace or in a
file-per-table
tablespace. When
innodb_file_per_table is enabled,
an InnoDB table is implicitly created in an
individual file-per-table tablespace. Conversely, when
innodb_file_per_table is
disabled, an InnoDB table is implicitly created
in the system tablespace.
When you create an InnoDB table, MySQL creates
a .frm file in a database
directory under the MySQL data directory. For a table created in a
file-per-table tablespace, an .ibd
file is also created. A table created in the system
tablespace is created in the existing system tablespace
ibdata files.
Internally, InnoDB adds an entry for each table
to the InnoDB data dictionary. The entry
includes the database name. For example, if table
t1 is created in the test
database, the data dictionary entry is
'test/t1'. This means you can create a table of
the same name (t1) in a different database, and
the table names do not collide inside InnoDB.
Viewing the Properties of InnoDB Tables
To view the properties of InnoDB tables, issue
a SHOW TABLE STATUS statement:
mysql> SHOW TABLE STATUS FROM test LIKE 't%' \G;
*************************** 1. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 41943040
Auto_increment: NULL
Create_time: 2015-03-16 16:42:17
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
In the status output, you see the
Row format property of
table t1 is Compact.
Although that setting is fine for basic experimentation, consider
using the
Dynamic
or
Compressed
row format to take advantage of InnoDB features
such as table compression and off-page storage for long column
values. Using these row formats requires that
innodb_file_per_table is enabled
and that innodb_file_format is
set to Barracuda:
SET GLOBAL innodb_file_per_table=1; SET GLOBAL innodb_file_format=barracuda; CREATE TABLE t3 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=DYNAMIC; CREATE TABLE t4 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=COMPRESSED;
Defining a Primary Key for InnoDB Tables
Always set up a primary
key for each InnoDB table, specifying
the column or columns that:
Are referenced by the most important queries.
Are never left blank.
Never have duplicate values.
Rarely if ever change value once inserted.
For example, in a table containing information about people, you
would not create a primary key on (firstname,
lastname) because more than one person can have the same
name, some people have blank last names, and sometimes people
change their names. With so many constraints, often there is not
an obvious set of columns to use as a primary key, so you create a
new column with a numeric ID to serve as all or part of the
primary key. You can declare an
auto-increment column
so that ascending values are filled in automatically as rows are
inserted:
-- The value of ID can act like a pointer between related items in different tables. CREATE TABLE t5 (id INT AUTO_INCREMENT, b CHAR (20), PRIMARY KEY (id)); -- The primary key can consist of more than one column. Any autoinc column must come first. CREATE TABLE t6 (id INT AUTO_INCREMENT, a INT, b CHAR (20), PRIMARY KEY (id,a));
Although the table works correctly without defining a primary key,
the primary key is involved with many aspects of performance and
is a crucial design aspect for any large or frequently used table.
It is recommended that you always specify a primary key in the
CREATE TABLE statement. If you
create the table, load data, and then run
ALTER TABLE to add a primary key
later, that operation is much slower than defining the primary key
when creating the table.
See the docs on "SHOW TABLE STATUS", for example http://www.mysql.com/doc/en/SHOW_TABLE_STATUS.html.
#!/bin/bash
if [ ! -f "$HOME/.my.cnf" ]; then
echo "Please create a ~/.my.cnf first"
exit 1
fi
mysql -B -N -e "SHOW DATABASES" mysql \
mysql -B -N -e "SHOW TABLES" "$database" \
| while read table; do
echo "+ Converting Table $table ($database)"
mysql -B -N -e "ALTER TABLE $table ENGINE = InnoDB" "$database"
done
done
exit 0
#use information_schema;
#select TABLE_NAME, ENGINE from TABLES where TABLE_SCHEMA='db';