如题所述
ããMySQLæ°æ®åºæå¤ç§åå¨å¼æï¼æ¯å¦ï¼MyISAMãInnoDBãMERGEãMEMORY(HEAP)ãBDB(BerkeleyDB)ãEXAMPLEãFEDERATEDãARCHIVEãCSVãBLACKHOLEççï¼æ常è§çä¹å°±æ¯MyISAMåInnoDBäºï¼ä¸é¢ä¸»è¦è®²è§£ä¸MyISAMåInnoDB两ç§mysqlæ°æ®åºåå¨å¼æçåºå«ã
ããMyISAMå¼ææ¯ä¸ç§éäºå¡æ§çå¼æï¼æä¾é«éåå¨åæ£ç´¢ï¼ä»¥åå ¨ææç´¢è½åï¼éåæ°æ®ä»åºçæ¥è¯¢é¢ç¹çåºç¨ãMyISAMä¸ï¼ä¸ä¸ªtableå®é ä¿å为ä¸ä¸ªæ件ï¼.frmåå¨è¡¨å®ä¹ï¼.MYDåå¨æ°æ®,.MYIåå¨ç´¢å¼ãMyISAMå¨ææMySQLé ç½®é被æ¯æï¼å®æ¯é»è®¤çåå¨å¼æï¼é¤éä½ é ç½®MySQLé»è®¤ä½¿ç¨å¦å¤ä¸ä¸ªå¼æã
ããMySQLæå¡å¨ä¸çå ¶ä»éäºå¡æ§åå¨å¼æï¼å¦MyISAMï¼éµä»ä¸åçæ°æ®å®æ´æ§èä¾ï¼ç§°ä¹ä¸ºâååæä½âãæç §äºå¡æ¯è¯ï¼MyISAM表æ»è½é«æå°å·¥ä½å¨AUTOCOMMIT=1模å¼ä¸ãååæä½é常è½æä¾å¯æ¯è¾çå®æ´æ§ä»¥åæ´å¥½çæ§è½ãä¸ç»è¿ä¼åè°æ´çæå¿«çäºå¡æ§è¡¨ç¸æ¯ï¼å®çé度快3ï½5åãç±äºMySQLæå¡å¨æ¯æ两ç§èä¾ï¼å èä½ è½å³å®æ¯å¦å©ç¨ååæä½çé度æ´å¥½å°æå¡äºä½ çåºç¨ç¨åºï¼æ使ç¨äºå¡ç¹æ§ã该éæ©å¯æ表è¿è¡ã
ãã
ããInnoDBåæ¯ä¸ç§æ¯æäºå¡çå¼æãç»MySQLæä¾äºå ·ææ交ï¼åæ»åå´©æºæ¢å¤è½åçäºå¡å®å ¨ï¼ACIDå ¼å®¹ï¼åå¨å¼æãæ以çæ°æ®åå¨å¨ä¸ä¸ªæè å¤ä¸ªæ°æ®æ件ä¸ï¼æ¯æ类似äºOracleçéæºå¶ãä¸è¬å¨OLTPåºç¨ä¸ä½¿ç¨è¾å¹¿æ³ãå¦æ没ææå®InnoDBé ç½®é项ï¼MySQLå°å¨MySQLæ°æ®ç®å½ä¸å建ä¸ä¸ªå为ibdata1çèªå¨æ©å±æ°æ®æ件ï¼ä»¥å两个å为ib_logfile0åib_logfile1çæ¥å¿æ件ã
ããInnoDBéå®å¨è¡çº§å¹¶ä¸ä¹å¨SELECTè¯å¥æä¾ä¸ä¸ªOracleé£æ ¼ä¸è´çééå®è¯»ãè¿äºç¹è²å¢å äºå¤ç¨æ·é¨ç½²åæ§è½ã没æå¨InnoDBä¸æ©å¤§éå®çéè¦ï¼å 为å¨InnoDBä¸è¡çº§éå®éåé常å°ç空é´ãInnoDBä¹æ¯æFOREIGN KEY强å¶ãå¨SQLæ¥è¯¢ä¸ï¼ä½ å¯ä»¥èªç±å°å°InnoDBç±»åç表ä¸å ¶å®MySQLç表çç±»åæ··åèµ·æ¥ï¼çè³å¨åä¸ä¸ªæ¥è¯¢ä¸ä¹å¯ä»¥æ··åã
ããInnoDBæ¯ä¸ºå¤ç巨大æ°æ®éæ¶çæ大æ§è½è®¾è®¡ãå®çCPUæçå¯è½æ¯ä»»ä½å ¶å®åºäºç£ççå ³ç³»æ°æ®åºå¼ææä¸è½å¹æçãInnoDBåå¨å¼æ被å®å ¨ä¸MySQLæå¡å¨æ´åï¼InnoDBåå¨å¼æ为å¨ä¸»å åä¸ç¼åæ°æ®åç´¢å¼èç»´æå®èªå·±çç¼å²æ± ã
ããInnoDBåå¨å®ç表ï¼ç´¢å¼å¨ä¸ä¸ªè¡¨ç©ºé´ä¸ï¼è¡¨ç©ºé´å¯ä»¥å å«æ°ä¸ªæ件ãInnoDB表å¯ä»¥æ¯ä»»ä½å°ºå¯¸ï¼å³ä½¿å¨æ件尺寸被éå¶ä¸º2GBçæä½ç³»ç»ä¸ãInnoDBä¹é»è®¤è¢«å æ¬å¨ææMySQL 5.1äºè¿å¶ååçéã
ããMyISAMå¼ææ¯ä¸ç§éäºå¡æ§çå¼æï¼æä¾é«éåå¨åæ£ç´¢ï¼ä»¥åå ¨ææç´¢è½åï¼éåæ°æ®ä»åºçæ¥è¯¢é¢ç¹çåºç¨ãMyISAMä¸ï¼ä¸ä¸ªtableå®é ä¿å为ä¸ä¸ªæ件ï¼.frmåå¨è¡¨å®ä¹ï¼.MYDåå¨æ°æ®,.MYIåå¨ç´¢å¼ãMyISAMå¨ææMySQLé ç½®é被æ¯æï¼å®æ¯é»è®¤çåå¨å¼æï¼é¤éä½ é ç½®MySQLé»è®¤ä½¿ç¨å¦å¤ä¸ä¸ªå¼æã
ããMySQLæå¡å¨ä¸çå ¶ä»éäºå¡æ§åå¨å¼æï¼å¦MyISAMï¼éµä»ä¸åçæ°æ®å®æ´æ§èä¾ï¼ç§°ä¹ä¸ºâååæä½âãæç §äºå¡æ¯è¯ï¼MyISAM表æ»è½é«æå°å·¥ä½å¨AUTOCOMMIT=1模å¼ä¸ãååæä½é常è½æä¾å¯æ¯è¾çå®æ´æ§ä»¥åæ´å¥½çæ§è½ãä¸ç»è¿ä¼åè°æ´çæå¿«çäºå¡æ§è¡¨ç¸æ¯ï¼å®çé度快3ï½5åãç±äºMySQLæå¡å¨æ¯æ两ç§èä¾ï¼å èä½ è½å³å®æ¯å¦å©ç¨ååæä½çé度æ´å¥½å°æå¡äºä½ çåºç¨ç¨åºï¼æ使ç¨äºå¡ç¹æ§ã该éæ©å¯æ表è¿è¡ã
ãã
ããInnoDBåæ¯ä¸ç§æ¯æäºå¡çå¼æãç»MySQLæä¾äºå ·ææ交ï¼åæ»åå´©æºæ¢å¤è½åçäºå¡å®å ¨ï¼ACIDå ¼å®¹ï¼åå¨å¼æãæ以çæ°æ®åå¨å¨ä¸ä¸ªæè å¤ä¸ªæ°æ®æ件ä¸ï¼æ¯æ类似äºOracleçéæºå¶ãä¸è¬å¨OLTPåºç¨ä¸ä½¿ç¨è¾å¹¿æ³ãå¦æ没ææå®InnoDBé ç½®é项ï¼MySQLå°å¨MySQLæ°æ®ç®å½ä¸å建ä¸ä¸ªå为ibdata1çèªå¨æ©å±æ°æ®æ件ï¼ä»¥å两个å为ib_logfile0åib_logfile1çæ¥å¿æ件ã
ããInnoDBéå®å¨è¡çº§å¹¶ä¸ä¹å¨SELECTè¯å¥æä¾ä¸ä¸ªOracleé£æ ¼ä¸è´çééå®è¯»ãè¿äºç¹è²å¢å äºå¤ç¨æ·é¨ç½²åæ§è½ã没æå¨InnoDBä¸æ©å¤§éå®çéè¦ï¼å 为å¨InnoDBä¸è¡çº§éå®éåé常å°ç空é´ãInnoDBä¹æ¯æFOREIGN KEY强å¶ãå¨SQLæ¥è¯¢ä¸ï¼ä½ å¯ä»¥èªç±å°å°InnoDBç±»åç表ä¸å ¶å®MySQLç表çç±»åæ··åèµ·æ¥ï¼çè³å¨åä¸ä¸ªæ¥è¯¢ä¸ä¹å¯ä»¥æ··åã
ããInnoDBæ¯ä¸ºå¤ç巨大æ°æ®éæ¶çæ大æ§è½è®¾è®¡ãå®çCPUæçå¯è½æ¯ä»»ä½å ¶å®åºäºç£ççå ³ç³»æ°æ®åºå¼ææä¸è½å¹æçãInnoDBåå¨å¼æ被å®å ¨ä¸MySQLæå¡å¨æ´åï¼InnoDBåå¨å¼æ为å¨ä¸»å åä¸ç¼åæ°æ®åç´¢å¼èç»´æå®èªå·±çç¼å²æ± ã
ããInnoDBåå¨å®ç表ï¼ç´¢å¼å¨ä¸ä¸ªè¡¨ç©ºé´ä¸ï¼è¡¨ç©ºé´å¯ä»¥å å«æ°ä¸ªæ件ãInnoDB表å¯ä»¥æ¯ä»»ä½å°ºå¯¸ï¼å³ä½¿å¨æ件尺寸被éå¶ä¸º2GBçæä½ç³»ç»ä¸ãInnoDBä¹é»è®¤è¢«å æ¬å¨ææMySQL 5.1äºè¿å¶ååçéã
温馨提示:答案为网友推荐,仅供参考
第1个回答 2018-07-30
MySQL默认采用的是MyISAM。
MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即 MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以 MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
InnoDB支持外键,MyISAM不支持。
InnoDB的主键范围更大,最大是MyISAM的2倍。
InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空 格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。
没有where的count(*)使用MyISAM要比InnoDB快得多。因 为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般 要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。
MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即 MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以 MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
InnoDB支持外键,MyISAM不支持。
InnoDB的主键范围更大,最大是MyISAM的2倍。
InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空 格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。
没有where的count(*)使用MyISAM要比InnoDB快得多。因 为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般 要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。
第2个回答 2021-02-25
MYISAM 表是典型的数据与索引分离存储,主键和二级索引没有本质区别。比如在 MYISAM 表里主键、唯一索引是一样的,没有本质区别。
MYISAM 表的索引存储方式最大的缺点没有按照物理数据行顺序存储,这样无论对主键的检索还是对二级索引的检索都需要进行二次排序。
INNODB 表本身是索引组织表,也就是说索引就是数据。下图表T1的数据行以聚簇索引的方式展示,非叶子节点保存了主键的值,叶子节点保存了主键的值以及对应的数据行,并且每个页有分别指向前后两页的指针。
INNODB 表不同于 MYISAM,INNODB 表有自己的数据页管理,默认 16KB。MYISAM 表数据的管理依赖文件系统,比如文件系统一般默认 4KB,MYISAM 的块大小也是 4KB,MYISAM 表的没有自己的一套崩溃恢复机制,全部依赖于文件系统。
INNODB 表这样设计的优点有两个:
1. 数据按照主键顺序存储。主键的顺序也就是记录行的物理顺序,相比指向数据行指针的存放方式,避免了再次排序。
2. 两个叶子节点分别含有指向前后两个节点的指针,这样在插入新行或者进行页分裂时,只需要移动对应的指针即可。
但是也有缺点:
1. 二级索引由于同时保存了主键值,体积会变大。特别是主键设计不合理的时候,比如用 UUID 做主键。
2. 对二级索引的检索需要检索两次索引树。第一次通过检索二级索引叶子节点,找到过滤行对应的主键值;第二次通过这个主键的值去聚簇索引中查找对应的行。
MYISAM 表的索引存储方式最大的缺点没有按照物理数据行顺序存储,这样无论对主键的检索还是对二级索引的检索都需要进行二次排序。
INNODB 表本身是索引组织表,也就是说索引就是数据。下图表T1的数据行以聚簇索引的方式展示,非叶子节点保存了主键的值,叶子节点保存了主键的值以及对应的数据行,并且每个页有分别指向前后两页的指针。
INNODB 表不同于 MYISAM,INNODB 表有自己的数据页管理,默认 16KB。MYISAM 表数据的管理依赖文件系统,比如文件系统一般默认 4KB,MYISAM 的块大小也是 4KB,MYISAM 表的没有自己的一套崩溃恢复机制,全部依赖于文件系统。
INNODB 表这样设计的优点有两个:
1. 数据按照主键顺序存储。主键的顺序也就是记录行的物理顺序,相比指向数据行指针的存放方式,避免了再次排序。
2. 两个叶子节点分别含有指向前后两个节点的指针,这样在插入新行或者进行页分裂时,只需要移动对应的指针即可。
但是也有缺点:
1. 二级索引由于同时保存了主键值,体积会变大。特别是主键设计不合理的时候,比如用 UUID 做主键。
2. 对二级索引的检索需要检索两次索引树。第一次通过检索二级索引叶子节点,找到过滤行对应的主键值;第二次通过这个主键的值去聚簇索引中查找对应的行。