一,MySQL的引擎问题
Mysql数据库引擎
Mysql常见的三中存储引擎为InnoDB、MyISAM、MEMORY。其区别提现在事物安全、存储限制、空间使用、插入数据的速度和对外键的支持上,具体如下:
特性 | InnoDB | MyISAM | MEMORY |
事物安全 | 支持 | 不支持 | 不支持 |
对外建的支持 | 支持 | 不支持 | 不支持 |
存储限制 | 64TB | 有 | 有 |
空间使用 | 高 | 低 | 低 |
内存使用 | 高 | 低 | 高 |
插入数据的速度 | 低 | 高 | 高 |
1)事物安全:
InnoDB支持事物安全,MyISAM和MEMORY两个不支持。
2)对外键的支持:
InnoDB对外键支持情况较好,MyISAM和MEMORY两个不支持外键。
3)存储限制:
InnoDB有64TB的存储限制,MyISAM和MEMORY要是具体情况而定。
4)空间使用:
InnoDB对空间使用程度较高,MyISAM和MEMORY对空间使用程度较低。
5)内存使用:
InnoDB和MEMORY对内存使用程度较高,MyISAM对内存使用程度较低。
6)插入数据的速度:
InnoDB插入数据的速度较低,MyISAM和MEMORY插入数据的速度较高。
InnoDB是MySQL5.5以上版本的默认存储引擎(Mysql5.5.5之前是MyISAM
更改 Mysql 默认引擎为 InnoDB步骤如下:
将InnoDB设置为默认的引擎如下:
a ,查看Mysql存储引擎情况:
mysql>show engines
(此命令告诉我们三条信息,第一,默认使用的引擎 第一行的就是,第二,该版本的MySQL所支持的引擎有哪些,比如下图,federated这个引擎MySQL5.7.22就不支持,第三,comment这一列有一个大致的引擎特性说明,比如告诉我们,innodb引擎的特性是Supports transactions, row-level locking, and foreign keys 也就是支持行锁定,外键和事务)
特别注意,information_schema这个默认的就存在的数据库内的表大部分都是memory引擎的哦,这个数据库会在数据库启动的第一时间加载出来的哦,里面都是模板表哦,此库不要随意乱动。
也可以这样查询:
select * from information_schema.engines;
#这个命令等价于 show engines
此命令输出如下:
b , 设置InnoDB为默认引擎:在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
- 重启Mysql服务器
- 登录Mysql数据库,mysql>show engines 如果出现 InnoDB |DEFAULT,则表示设置InnoDB为默认引擎成功
同理,将MySQL设置为myisam引擎也是在my.cnf这个主配置文件中[mysqld]标签下加入default-storage-engine=MYISAM 然后重启MySQL服务即可,重启之后,配置文件内写的默认引擎是哪个,那么,此后新建的库表都会使用这个配置内定义的引擎。
查询有哪些数据库和表是myisam引擎的??
select table_catalog
,table_schema
,table_name
,engine
from information_schema.tables
where engine='MyISAM';
查询有哪些数据库和表是innodb引擎的???
select table_catalog
,table_schema
,table_name
,engine
from information_schema.tables
where engine='INNODB';
c , 查询某个指定的表使用的是哪个引擎?
比如,查询mysql数据库的user表是使用的哪个引擎
show create table mysql.user; 会显示原始的建表过程,其中,最后表明该表使用的引擎是哪个
show create table mysql.user;
#输出如下:
CREATE TABLE `user` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int(11) unsigned NOT NULL DEFAULT '0',
`max_updates` int(11) unsigned NOT NULL DEFAULT '0',
`max_connections` int(11) unsigned NOT NULL DEFAULT '0',
`max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',
`plugin` char(64) COLLATE utf8_bin NOT NULL DEFAULT 'mysql_native_password',
`authentication_string` text COLLATE utf8_bin,
`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`password_last_changed` timestamp NULL DEFAULT NULL,
`password_lifetime` smallint(5) unsigned DEFAULT NULL,
`account_locked` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
在比如查询information_schema这个数据库内的files这个表使用的引擎:
show create table information_schema.files;
show create table information_schema.files;
#输出如下:
NULL,
`RECOVER_TIME` bigint(4) DEFAULT NULL,
`TRANSACTION_COUNTER` bigint(4) DEFAULT NULL,
`VERSION` bigint(21) unsigned DEFAULT NULL,
`ROW_FORMAT` varchar(10) DEFAULT NULL,
`TABLE_ROWS` bigint(21) unsigned DEFAULT NULL,
`AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL,
`DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
`MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
`INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL,
`DATA_FREE` bigint(21) unsigned DEFAULT NULL,
`CREATE_TIME` datetime DEFAULT NULL,
`UPDATE_TIME` datetime DEFAULT NULL,
`CHECK_TIME` datetime DEFAULT NULL,
`CHECKSUM` bigint(21) unsigned DEFAULT NULL,
`STATUS` varchar(20) NOT NULL DEFAULT '',
`EXTRA` varchar(255) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8
d,
修改指定表所使用的引擎
比如,修改mysql.user 这个表的引擎为innodb
alter table mysql.user engine=innodb;
或者修改mysql.user 这个表的引擎为myisam
alter table mysql.user engine=myisam;
或者修改information_schema.files 这个表的引擎为innodb(不会成功,memory引擎不能转换成其它的引擎,内存常驻的嘛 )
alter table information_schema.files engine=innodb;
#运行结果如下:
alter table information_schema.files engine=innodb
> 1044 - Access denied for user 'root'@'%' to database 'information_schema'
> 时间: 0s
OK,经过以上的介绍,我们应该可以控制哪个表使用哪个引擎了,如果有常用的select操作的引擎,而被无意设置为myisam引擎,我们就可以修改成innodb引擎,提高这个表的使用效率啦。
那么,每个表的编码我们也可以任意指定吗?答案是肯定的啦。
MySQL的编码系统比较复杂,晦涩,难搞!!!!
看如下命令:
show variables like "%char%";
输出如下:
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database latin1
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir /var/lib/mysql/mysql/charsets/
在my.cnf文件配置的init_connect='SET NAMES utf8mb4',这里的编码定义只控制character_set_client、character_set_connection、 character_set_results的编码方式 。
首先
- 我们需要知道,character_set_server 这个选项在my.cnf 这个文件里是一个全局的,所有数据库新建表,如果建库或者建表的时候,不指定编码的话 ,那么,你设定的是哪个编码,它就会使用哪个编码,也就是默认的编码啦。(这个已经经过我测试啦,新建一个库,然后新建一个表,这个表如果建立的时候没有指定编码,那么必定是character_set_server 的值啦!!!!!)
其次,
- character_set_database:默认数据库的字符集编码.假设没有默认数据库,则该变量值与character_set_server同样.事实上这个值代表的就是你当前数据库的编码而已,比方使用"use test",而test数据库的编码为latin1的话,这个值就是latin1.而你切换的时候"use test2",则character_set_database的值就是数据库test2的编码.
再次,数据库的编码和表的编码是互相独立的,即使数据库的编码比如是指定的gbk,表仍然可以任意指定编码,不会强制库表一致。
因此,我们在遇到编码问题的时候,可以不用管数据库的编码是什么,只需要强制更改指定表的编码就可以啦。那么,如何更改表的编码呢?
首先需要 use 要更改的表的数据库,比如,要更改mysql 这个数据库的 user表的编码,原编码为utf8mb4,现在要更改为latin1 ,那么,命令应该为:
- use mysql
- alter table `user` convert to character set latin1; ---注意,这里是反引号。
前方高能:
修改表尤其是大表的引擎和编码会造成锁表,也就是说,此操作需要谨慎!!!!!!!!!!!!!!