查询表的相关信息
mysql会在数据库的子目录下创建一个和表同名.frm文件保存表的定义
SHOW TABLE STATUS LIKE ‘user’
显示的字段主要包含以下几个
Engine:存储引擎
Index_length:索引大小
Data_free:已分配但还没有使用的空间
…
mysql的存储引擎
MyISAM | InnoDB |
---|---|
表锁 | 行锁,在不能确定扫描范围时,也会锁表.例如:updata table set num=1 where name like “%aa%” |
支持全文索引,sql语句是:explain select * from stu where MATCH(text) AGAINST(‘xxx’) | 不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。 |
不支持事务 | 支持事务 |
不支持外键 | 支持外键 |
保存行数 | 不保存行数,在SELECT count(*)扫描全表 |
表存放三个文件。.frm文件存放表格定义 .myd是数据文件,索引文件是.myi | 数据和索引放在表空间里 |
可被压缩,存储空间小,MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少,能加载更多索引 | Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小 |
Memory引擎:
如果需要快速的访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表很有用,比MyISAM快一个数量级,并且所有数据都保存在内存中,不需要进行磁盘i/o。Memory支持hash查询快,是表锁并发写入性能低,每行长度固定,即使时varchar也会变为char,可能导致内存的浪费。mysql查询过程中临时表的保存的中间结果便是Memory表
修改存储引擎
ALTER TABLE mytable ENGINE = innoDB
上述语法适合所有存储引擎,但是执行时间很长,mysql会按行将数据从原表复制到一张新表,复制期间会消耗系统所有的i/o能力,同时原表会加读锁。
或者采用导出导入的方法:可以使用musqldump工具将数据导出,然后修改create table语句中的存储引擎选项,同时注意修改表名。
最好采用创建与查询方法:
CREATE TABLE innodb_table LIKE myisam_table;
ALTER TABLE innodb_table ENGINE = InnoDB;
INSERT INTO innodb_table SELECT * FROM mysiam_table;
如果表的数据大可以分批
START TRANSACTION;
INSERT INTO innodb_table SELECT * FROM mysiam_table WHERE id BETWEEN x AND y;
COMMIT;