Mysql
1.char与varchar的区别
mysql 5.0以上数据长度都用字符长度度量。
- char 定长字符串、速度较快但浪费空间,最多255个字符(与编码无关);
- varchar 变长字符串、速度较慢但节省空间,行的最大长度65535个字节,长度与编码有关gbk是(65535-1-2-行中其他字段暂用的长度)/2,utf-8是(65535-1-2-行中其他字段占用的长度)/3<=21844。
3. 常见的引擎
MyISAM、InnoDB、MEMORY、MRG_MyISAM、HEAP、BOB、ARCHIVE、CSV
MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。
InnoDB(默认):支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。
Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
Memory存储引擎使用存在于内存中的内容来创建表;
对比MyISAM和InnoDB区别
- InnoDB支持事务,MyISAM不支持;
- InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
- InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
- Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
- innodb支持行锁,myisam支持页锁
如何选择
- 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
- 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
- 默认引擎InnoDB
4. select count(*)与select count(1)的区别
与数据表使用的引擎和版本有关。
目前主流的引擎Innodb。
count(primary) > count(1) > count() > count(colunm)
有些版本对count()做过优化。速度可能是最快的。需要在数据库中实际测试
5. select * 和select colunm 的区别
尽量避免使用select *
原因:
- select * 多一个解析为字段的过程
- 取出不需要的字段,浪费内存
- 取出不需要的字段,浪费sql性能
- select colunm如果都是索引字段,触发索引覆盖,数据库只需要查所以表,性能会显著提升