<--目录-->

1)查看存储引擎

2)修改存储引擎

3)Innodb和MyIsam讲解

4)事务

5)锁


【查看存储引擎】

1.查看当前数据库管理系统支持哪些引擎

mysql> show engines;

+------------+---------+------------------------------------------------------------+--------------+------+------------+

| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |

+------------+---------+------------------------------------------------------------+--------------+------+------------+

| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |

| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |

| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |

| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |

| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |

+------------+---------+------------------------------------------------------------+--------------+------+------------+

5 rows in set (0.00 sec)


#还可以通过如下方法查询

mysql> show variables like 'have%';

+-------------------------+----------+

| Variable_name           | Value    |

+-------------------------+----------+

| have_community_features | YES      |

| have_compress           | YES      |

| have_crypt              | YES      |

| have_csv                | YES      |

| have_dynamic_loading    | YES      |

| have_geometry           | YES      |

| have_innodb             | YES      |

| have_ndbcluster         | NO       |

| have_openssl            | DISABLED |

| have_partitioning       | YES      |

| have_query_cache        | YES      |

| have_rtree_keys         | YES      |

| have_ssl                | DISABLED |

| have_symlink            | DISABLED |

+-------------------------+----------+

14 rows in set (0.00 sec)


#查看服务器默认使用的存储引擎

mysql> show variables like 'storage_engine';

+----------------+--------+

| Variable_name  | Value  |

+----------------+--------+

| storage_engine | MyISAM |

+----------------+--------+

1 row in set (0.00 sec)


#显示当前服务器用的是什么存储引擎

mysql> show variables like "table_type";   

+---------------+--------+

| Variable_name | Value  |

+---------------+--------+

| table_type    | MyISAM |

+---------------+--------+

1 row in set (0.00 sec)


2.修改默认存储引擎

方法1:

1、首先打开my.cny配置文件

[mysqld]

#MySQL服务器的存储引擎

default-storage-engine=innodb


2、重启服务

service mysqld restart


3、再次查看

mysql> show variables like 'storage_engine'; 

+----------------+--------+

| Variable_name  | Value  |

+----------------+--------+

| storage_engine | InnoDB |

+----------------+--------+

1 row in set (0.00 sec)


方法2:

alter table 表名 engine=存储引擎名

alter table t1 engine=MyISAM

create talbe 表名(字段列表)engine=存储引擎名;

create table t1(id int)engine=innodb;


方法3:

mysql_convert_table_format --usr=root --password=wsyht123 --socker=/data/3306/mysql.sock --engine-MyISAM wsyht t1  #wsyht是库名,和t1是表名


【Innodb和MyIsam讲解】

MyISAM 引擎适用的生产业务场景

1、不需要事务支持的业务(例如转账就不行,充值付款)

2、一般为读写数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合

3、读写并发访问相对较低的业务(纯读线写高并发也可以)(锁定机制问题)

4、数据修改相对较少的业务,(阻塞问题)

5、以读为主的业务,例如:www, blog,图片信息数据库,用户数据库,商品库等业务

6、对数据一致性要求不是很高的业务

小结:单一对数据库的操作都可以使用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等,


MyISAM引擎调优精要

1、设置合适的索引(缓存机制)

2、调整读写优先级,根据实际需求确保重要操作更优先执行

3、启用延迟插入改善大批量读写入性能(降低写入频率,尽可能多条数据一次性写入)

4、尽量顺序操作insert数据都写入到尾部,减少阻塞

5、分解大的时间长的操作,降低单个操作的阻塞时间 

6、降低并发数(减少对MySQL访问),某些高并发场景通过应用进行排对对列机制Q对列

7、对相对静态(更改不频繁)的数据库数据,充分利用Query Cache或memcached缓存服务可以术大的提    高访问效率


InnoDB引擎适合用的生产业务场景

1、需要事务支持的业务(具有较好的事务特性)

2、行级锁定对高并发有很好的适应能力,但需要确保查询通过索引完成

3、数据读写及更新都较为频繁的场景,如:BBS,SNS,微博,微信等 

4、数据一致性要求较高的业务,例如:充值转账,银行卡转账

5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘IO


InnoDB引擎调优精要

1、主健尽可以小,避免给Secondary index带来过大的空间负担

2、避免全表扫描,因为会使用表锁

3、尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗

4、在大批量插入的时候,尽量自已控制事务而不要使用autocommit自动提交,有开关可以控制提交方式

5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性,如果Innodb_flush_log_at_trx_commit的值为0,log,buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作

6、避免主健更新,因为这会带来大量的数据移动


Innodb和MyIsam的区别

InnoDB特性: 支持行锁,支持事务,支持外健 ,批量插入速度慢,内存使用高,空间使用高,数据可压缩,独享表空间

MyISAM:支持表锁,不支持事务,不支持外健 ,批量插入速度快,内存使用低,空间使用低,数据不可压缩,共享表空间


生产环境中如何选用MySQL引擎

在一般既有读又有写的业务中,建议使用innodb引擎,一句话尽可能多的使用innodb


mysql存储引擎 I/O insert out 插进去 读出来

1.mysql 体系结构

  mysql是由连接池、sql接口、分析器、优化器、

  缓存和缓冲、管理工具、存储引擎、物理存储设备

1.连接池:进程数限制、内存检查、缓存检查等

2.SQL接口:用户通过sql客户发过来的命令,由sql接口接收,sql操作有:

  DML数据操作语言:查询,修改,升级数据等

  DDL数据定义语言:创建一个新的数据库,新的索引,删除一个用户等

3.分析器:分析查询语句 事务处理 对象访问权限

4.优化器:优化访问路径、生成执行树

5.缓存和缓冲 保存sql查询结果

6.管理工具,备份,恢复,安全,移植,集群等,这些工具一般和文件系统打交道

  不需要和mysql-server打交道,他们对应的都是命令。

7.存储引擎:用来管理文件系统,将逻辑结构转换为物理结构的程序。负责为数据库执行实际的数据I/O操作

8.不同的存储引擎有不同的功能和存储方式;物理存储设备(文件系统)



【事务】

事务:你的一次sql操作从开始执行到正确执行结速的这个过程称为事务

事务回滚:恢之到未操作一切动作前的状态

EXAMPLE:

#创建测试需要的表,注意存储引擎一定要为innodb

mysql> use wsyht

Database changed


mysql> create table t1(

    -> id int(3) primary key auto_increment,

    -> name varchar(10) not null

    -> )engine=innodb;


mysql> insert into t1 values(1,'wsyht'),(2,'peter'),(3,'jenkins');

Query OK, 3 rows affected (0.00 sec)

Records: 3  Duplicates: 0  Warnings: 0


mysql> select *from t1;

+----+---------+

| id | name    |

+----+---------+

|  1 | wsyht   |

|  2 | peter   |

|  3 | jenkins |

+----+---------+

3 rows in set (0.00 sec)


#关闭自动提交

set global autocommit=0 


#开启一个事务

mysql> begin;

Query OK, 0 rows affected (0.00 sec)


#更新一条记录

mysql> update t1 set name='test' where id=1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0


#提交事务

mysql> commit;

Query OK, 0 rows affected (0.01 sec)


#发现记录已经更改生效

mysql> select *from t1;

+----+---------+

| id | name    |

+----+---------+

|  1 | test    |

|  2 | peter   |

|  3 | jenkins |

+----+---------+

3 rows in set (0.00 sec)


#开启另外一个事务

mysql> begin;

Query OK, 0 rows affected (0.00 sec)


mysql> update t1 set name='wsyht' where id=1;    

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0


mysql> select *from t1;

+----+---------+

| id | name    |

+----+---------+

|  1 | wsyht   |

|  2 | peter   |

|  3 | jenkins |

+----+---------+

3 rows in set (0.00 sec)


#回滚事务,只要开启事务还没提交就可以进行回滚

mysql> rollback;

Query OK, 0 rows affected (0.00 sec)


#发现数据已经回滚

mysql> select *from t1;

+----+---------+

| id | name    |

+----+---------+

|  1 | test    |

|  2 | peter   |

|  3 | jenkins |

+----+---------+

3 rows in set (0.00 sec)



【锁】

锁机制(解决用户的并发访问问题)

锁类型

写锁(delete update insert)互斥锁 排他锁

读锁(select desc show)共享锁


锁粒度

表锁(myisam) 并发访问量不高  系统开销小

行锁(innodb) 并发访问高      系统开销大