mysql 何时使用myisam,何时使用innodb?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 何时使用myisam,何时使用innodb?相关的知识,希望对你有一定的参考价值。

1、MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

2、InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

扩展资料:

MyISAM和InnoDB主要区别:

1、MyISAM是非事务安全型的,而InnoDB是事务安全型的。

2、MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

3、MyISAM支持全文类型索引,而InnoDB不支持全文索引。

4、MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

5、MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少麻烦。

6、InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表。

参考资料来源:百度百科—— MyISAM 

参考资料来源:百度百科—— InnoDB

参考技术A MYISAM和INNODB是mysql数据库提供的两种存储引擎。两者的优劣可谓是各有千秋。INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定。

如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。

如果你的应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。

有人说MYISAM只能用于小型应用,其实这只是一种偏见。如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。本回答被提问者和网友采纳
参考技术B 一般都是选用innodb了,主要是myisam的全表锁,读写串行问题,并发效率锁表,效率低
myisam对于读写密集型应用一般是不会去选用的

论MySQL何时使用索引,何时不使用索引

索引:

使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

在数据库关系图中,您可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。

注意:

并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添 加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能 需要限制索引的数量。

可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。

如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。

确定索引的有效性:

  • 检查查询的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。
  • 对新索引进行试验以检查它对运行查询性能的影响。
  • 考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。
  • 检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。
  • 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。

 

MySQL何时使用索引

对一个键码使用>, >=, =, <, <=, IF NULL和BETWEEN

  1. SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5; 
  2. SELECT * FROM table_name WHERE key_part1 IS NULL; 

当使用不以通配符开始的LIKE

  1. SELECT * FROM table_name WHERE key_part1 LIKE \'jani%\' 

在进行联结时从另一个表中提取行时

  1. SELECT * from t1,t2 where t1.col=t2.key_part 

找出指定索引的MAX()或MIN()值

  1. SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10 

一个键码的前缀使用ORDER BY或GROUP BY

  1. SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3 

在所有用在查询中的列是键码的一部分时间

  1. SELECT key_part3 FROM table_name WHERE key_part1=1 

MySQL何时不使用索引

如果MySQL能估计出它将可能比扫描整张表还要快时,则不使用索引。例如如果key_part1均匀分布在1和100之间,下列查询中使用索引就不是很好:

  1. SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90 

如果使用HEAP表且不用=搜索所有键码部分。

在HEAP表上使用ORDER BY。

如果不是用键码第一部分

  1. SELECT * FROM table_name WHERE key_part2=1 

如果使用以一个通配符开始的LIKE

  1. SELECT * FROM table_name WHERE key_part1 LIKE \'%jani%\' 

搜索一个索引而在另一个索引上做ORDER BY

  1. SELECT * from table_name WHERE key_part1 = # ORDER BY key

 

增加注明:当查询条件字段相同时,使用OR范围查询索引可以执行,反之,索引失效。

    例如:

  1. SELECT * from table_name WHERE name= "A"  OR  name="B";(生效)
  2. SELECT * from table_name WHERE name= "A"  OR  sex="男";(失效)

误区

  1.并不是在where条件常用的列上加上索引,一条语句只会走一个索引。

  2.在多列建立索引,查询哪一列,都将发挥作用? 满足左前缀要求

       联合索引   index(A1,A2,A3)

       where A=1                        (生效)

    where A=1 and where A2=2               (生效)

    where A=1 and where A2=2 and where A3=3              (生效)

    where A=2        where A3=3                                               (不生效)

    where A=1 and where A2>2 and where A3=3                      (A1,A2生效,A3不生效)

    where A=1 and where A2 like \'jay%\' and where A3=3          (A1,A2生效,A3不生效)

SQL优化

1.limit分页优化

2.聚集索引:主键、没有主键则定位第一个唯一索引(所有行的值非空)、如果上2个条件都不满足则自动产生一个6字节的id聚集索引。

3.辅助索引:包含键值的书签,会存储书签数据。

4.count(*)   改为辅助索引。

 

转自(https://www.cnblogs.com/crazylqy/p/4706228.html)

以上是关于mysql 何时使用myisam,何时使用innodb?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 配置:何时使用连字符以及何时使用下划线

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?

论MySQL何时使用索引,何时不使用索引

PHP和MySQL中何时使用'@'运算符[重复]

MySQL中的`unsigned`是啥意思以及何时使用它?

何时在 MYSQL 中使用 Sequelize?