生产环境中建表,我们如何决定存储引擎的使用类型?
对于查询操作较多的表,使用Myisam引擎较为合适,以节省系统资源.
而,对于写操作相对较多的表,适合Innodb引擎,以解决并发性访问量大的问题.
什么是存储引擎?
作为可插拔式的组件提供,mysql自带的功能程序,专属于表的处理器;不同的存储引擎有不同的动能和存储方式.
如,Mysql 5.0/5.1 存储引擎为MyISAM, 而Mysql 5.5/5.6 存储引擎为Innodb.
查看数据库可用的存储引擎:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.01 sec)
那么,配置存储引擎有哪些方法?
1.建表时,手动指定存储引擎,如:
mysql> create database db10;
mysql> create table db10.t1(
-> id int,name char(10))engine=myisam; //建表时指定存储引擎为myisam
Query OK, 0 rows affected (0.05 sec)
mysql> show create table t1 \G; //查看存储引擎
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 //显示存储引擎为MyISAM
1 row in set (0.01 sec)
2.在数据库服务的主配置文件中修改存储引擎,如:
#vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam //指定存储引擎
# systemctl restart mysqld //重启加载配置
3.对已建表的引擎做修改
mysql>alter table 库名.表名 engine=引擎类型;
如:mysql>alter table db10.t1 engine=myisam;
存储引擎有哪些特点?
Myisam存储引擎: 支持表级锁;不支持事务,事务回滚,外键.
Myisam的表文件: 表结构:表名.frm; 索引:表名.MYI; 数据:表名.MYD
Innodb存储引擎: 支持行级锁定,支持事务,事务回滚,外键.
Innodb的表文件:表名.frm和表名.idb.
Innodb的日志文件:ibdata1,ib_logfile0,ib_logfile1
Mysql的锁机制有哪些?
锁的力度:表级锁(整张表)与行级锁(单行)
锁的类型:a.读锁(共享锁),支持并发性读 b.写锁(互斥,排它);独立的锁,上锁期间其它线程不能读和写.
查看当前锁的状态
Mysql>show status like "%table_lock%"'
+-----------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------+-------+
| Performance_schema_table_lock_stat_lost | 0 |
| Table_locks_immediate | 88 |
| Table_locks_waited | 0 |
+-----------------------------------------+-------+
事务的特性(ACID),有哪些?
Atomic原子性,事务的操作是一个整体,不可分割,要么全部成功,要么全部失败.
Consitency一致性,事务操作的前后,表中的记录没有变化.
Isolation隔离性,事务之间的操作是隔离不受彼此影响的.
Durability永久性,数据一旦提交即不可更改.
测试永久性: 开两个相同的终端4.50,其中一个终端关闭autocommit.
mysql> show variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set autocommit=off; //关闭自动提交功能
mysql> show variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> create table db10.a4(
-> id int )engine=innodb;
Query OK, 0 rows affected (0.37 sec)
mysql> insert into db10.a4 values(200);
mysql> insert into db10.a4 values(300);
mysql> select * from db10.a4; //在关闭了commit的终端可以查看到插入的数据,而没有关闭commit的终端却不能查看到提交的数据.
+------+
| id |
+------+
| 200 |
| 300 |
+------+
2 rows in set (0.00 sec)
mysql> commit; //执行commit后,在没有关闭commit的终端可以查看到插入的数据.
mysql>rollback; //回滚
结束.