mysql 数据库引擎常识全集

1、mysql引擎简介:

    MyISAM引擎是mysql关系数据库管理系统的默认存储引擎(mysql 5.5以前)。这种mysql表存贮结构从的旧的ISAM代码扩展出许多有用的功能。在新版本的mysql中,InnoDB引擎由于其对事务参照的完整性,以及更高的并发性等优点开始逐步的取代MYISAM引擎。

    #ENGINE=MyISAM myisam表都对应于硬盘上的三个文件。这三个文件有一样的文件名,但是有不同的扩展名指示其类型用途:.frm文件保存表的定义,这个文件并不是myISAM引擎的一部分,而是服务器的一部分;.MYD保存表的数据;MYI是表的索引文件。

    MYsql5.5 支持事务的引擎:innodb、ndb(mysql集群引擎)


2、数据库事务介绍:

  事物务就是逻辑上的一组sql操作,组成这组操作的各个sql语句,要么全部成功,要么全部失败;

   范例:hiboy给higirl转账五元

        流程:a,从hiboy银行卡取出五元,计算式money-5.

              b,把上面五元钱打入higirl的账户上,higirl收到5块,money+5.

              上述转账的过程,对应的sql语句为

              update account set money=money-5 where name="hiboy";

              update account set money=money-5 where name="higirl";

              上述的两条sql操作,在事务中的操作就是要么都执行,要么都不执行,这就是事物的原子性


3、事务的四大特点:

    1、原子性(Atomicity)

        事物是一个不可分割的单位,事务中所有sql等操作要么都发生,要么都不发生。

     2、一致性(Consistency)

        事务发生前和发生后,,数据的完整行必须保持一直。

     3、隔离性(Isolation)

        当前并发访问数据时,一个正在执行的事务在执行完毕前,对于其它的会话是不可见的,多个并发事务之间的数据是相互隔离的。

        #innodb 事务参数 --single-transaction

     4、持久性(Durability)

        一个事务一旦被提交,她对数据库中的数据改变是永久性的。如果出现错误,事务也不允许撤销,只能通过“补偿性事务”。

    

4、事务的开启:

    数据库默认事务是自动提交的,也就是发一条sql它就执行一条。如果想多条sql放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql会自动回滚事务。或者使用rollbak命令手动回滚事务。

    数据库开启事务命令:

    set autocommit= OFF禁止自动提交

    set autocommit=ON 开启自动提交

    SET GLOBAL autocommit= ON; 全局设置

    rollback 回滚事务

    commit   提交事务

    查看: show variables like '%auto%';
    +-----------------------------+-------+
    | Variable_name               | Value |
    +-----------------------------+-------+
    | auto_increment_increment    | 1     |
    | auto_increment_offset       | 1     |
    | autocommit                  | OFF   |
    | automatic_sp_privileges     | ON    |
    | innodb_autoextend_increment | 8     |
    | innodb_autoinc_lock_mode    | 1     |
    | sql_auto_is_null            | OFF   |
    +-----------------------------+-------+

5、MyISAM引擎的特点:

    1、不支持事务:(事务就是逻辑上sql语句)

    举例:银行转账,保持数据的一致性;

    2、表级锁定,数据跟新时锁定整个表,其锁定机制是表级锁定,虽然让锁定的实现成本很小但同时大大降低了并发的性能;

    3、读写互相堵塞,不仅会在写入时候阻塞读取,但读本身并会阻塞另外的读;

    4、只会缓存索引,myisam 可以通过key_buffer_size缓存索引,以大大提高性能减少磁盘IO,但是这个缓存只缓存索引,而不会缓存数据。

    #grep key_buffer my.cnf             key_buffer_size = 16M

    5、读取速度快。占用资源相对少;

    6、不支持外键约束,但支持全文索引;



6、MyISAM生产场景:

    1、读数据比较多的应用,读写都频繁的场景不适合,读多或者写多的都适合;

    2、不需要事物支持的业务(例如银行)

    3、读写并发相对较低的业务(纯读纯写高并发的也可以)

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

    5、对数据一致性要求不高的业务

    6、硬件资源比价差的机器用myISAM

    7、使用读写分离的mysql从库可以使用MYISAM

 #小结:单一数据库的操作都可以适合使用MYISAM ,所谓单一就是尽量纯读或纯写。

7、MyISAM调优精要:

    1、设置合适的索引    

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

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

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

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

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

     7、(对相对静态,更改不频繁)充分利用query cache 或redis。 memcache缓存服务

       # grep query my.cnf
query_cache_size = 2M  #缓存的空间大小  query_cache_limit = 1M #缓存的限制  query_cache_min_res_unit = 2k  #最小缓存对象
     8、myISAM 的count只有在全表扫描的时候特别高效,带有其它条件的ccoun都需要进行实际的数据访问;

     9、可以把主从同步的主库使用innodb,从库使用MYisam引擎; (不推荐)

 

8、InnoDB:引擎的特点特性:

    #InnoDB使用频率:99%

    #对应的数据库的文件:innodb_data_file_path= ibddata1:128:autoextend (初始化的时候自动生产这么大,自动扩展)

    1、支持事务;支持4个事务隔离级别,支持多版本读。

    2、行级锁定(跟新时一般是锁定当前行):通过索引实现,全表扫描仍然后是锁表。注意间隙锁的影响;

    3、读写阻塞与事物隔离级别相关;

    4、具有高效的缓存特性:能缓存索引,也能缓存数据;

    4、支持分区,表空间,类似oracle数据库;

    5、支持外键约束,5.5以前不支持全文索引,以后的支持了。

    7、和MYISAM 引擎相比,iNNODB对硬件资源要求比较高

       ### :  innodb_fuffer_pool_size = 32M 重量级参数 ,不要太大 , 1/8 差不

9、InnoDB 生产场景:

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

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

     3、数据读与写都较为频繁的场景

     4、数据一致性都要求较高的业务

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

     # grep -i innodb my.cnf

     6、可以独立表空间;

        #独立表空间对应物理数据文件:

          参数: my.cnf  【mysqld】

           innodb_file_per_table

           innodb_data_home_dir =/data/xxx

           文件: ll /data/3306/data/ibdatal


10、InnoDB 引擎调优精要:

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

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

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

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

     5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性;

        #如果innodb_lush_log_at_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交数据的时候不做任何操作。

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

11、如何确定MYsql服务器有哪些引擎可用:

    查看:  show engines ;

    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         |
| 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         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.06 sec)


12、Innodb引擎的重要参数:

     default_table_type = InnoDB
      innodb_additional_mem_pool_size = 4M
      innodb_buffer_pool_size = 2048M
      innodb_data_file_path = ibdata1:128M:autoextend
      innodb_file_io_threads = 4
      innodb_thread_concurrency = 8
      innodb_flush_log_at_trx_commit = 2
      innodb_log_buffer_size = 16M
      innodb_log_file_size = 128M
      innodb_log_files_in_group = 3
      innodb_max_dirty_pages_pct = 90
      innodb_lock_wait_timeout = 120
      innodb_file_per_table = 0


13、myISAM 引擎重要的参数: key_buffer_size = 2048M


14、如何修改MySQL引擎:

    法1:

     创建后引擎的更改,5.0以上

     ALTER TABLE TEST ENGINE = INNODB;

    ALTER TABLE TEST ENGINE = MyISAM;

          查看:

    法2:

     使用sed对备份内容进行引擎替换;

     mysqldump > back。sql

     nohup sed -e 's/MyISAM/InnoDB' back.sql > kong.back.sql &

     mysql < kong.back.sql

    #不适用数据库过大;

    

    法3: 

     使用  mysql_convert_table_forma 命令修改

      查看:`which mysql_convert_table_format`  --help

      范例:mysql_convert_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=MyISAM kong t2

    

    

    

本文出自 “思想大于技术” 博客,谢绝转载!

你可能感兴趣的:(mysql,数据库引擎)