mysql的概念理解(上)

让人想犯罪 __ 提交于 2019-12-13 16:57:53

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

                                                      
 这是一篇设计mysql数据库时候的一些小结。主要是对对MYISAM和INNODB俩种引擎进行简单介绍,还有表的一些属性进行详细介绍。

   MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,

   InnoDB:这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。

   在数据表里添加一个字段,该字段所拥有的属性是:(phpmyadmin字段查看与解释)
   名字(field): 字段直接在数据表显示的名字(字段名)
    
    类型(type):常用的类型int(整数型,一般用来储存手机号,学号,平台的编号,或者自增的id)  varchar和char(字符串型长度在0-255之间,前者空间可以自由变动,后者空间一旦设定长度就不会变动,但是会造成前者索引效率相对比较差,在小型开发中,影响不大), text(文本类型长度0-65535)
    
    长度(length):不同的类型对应不同的长度,比如有的时候如果用tinyint(只能取0-255的值)合适的长度可以节约数据存储空间(在数据量不大的时候,其实意义不大,现在的数据库都挺大的)

    整理(CHARSET=utf8):该数据表的字符集,会在create test () CHARSET = utf8 进行使用,现在普遍默认的编码格式都是utf8 gbk很容易出现乱码问题,需要进行转换

    默认(DEFAULT):(默认值,就是当添加数据库的时候,没有值情况下显示的值)

    数据类型:binary(binary属性只用于char和varchar值。当为列指定了该属性时,将以区分大小写的方式排序。与之相反,忽略binary属性时,将使用不区分大小写的方式排序)unsigned 属性只针对整型(这个具体的类型和C语言里的是一样的)

   是否为空:一般都默认为not null(一般主要用NOT NULL和NULL俩种类型)
    auto_increment(自增类型,最常用的就是用户注册的时候,ID值自动增长)


    数据约束:(主要有五种类型的约束 check的约束mysql暂时不支持)
    primary key (主键约束 = 非空约束+唯一性约束)
    foreign key (外键约束,增加格式:alter table 表 add  constraint 外键约束名称 foreign key (列)  references 表 (主键列);)
    NOT NULL(非空约束)
    UNIQUE(唯一性约束)
    CHECK(校验约束,mysql暂时不支持)
   
    注释(comment):(对这张表的用途的一般说明)

    示例:
  

  CREATE TABLE `wp_action` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` char(30) NOT NULL DEFAULT '' COMMENT '行为唯一标识',
  `title` char(80) NOT NULL DEFAULT '' COMMENT '行为说明',
  `remark` char(140) NOT NULL DEFAULT '' COMMENT '行为描述',
  `rule` text COMMENT '行为规则',
  `log` text COMMENT '日志规则',
  `type` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '类型',
  `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态',
  `update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='系统行为表'

    下面对MYSQL里一些常用的概念进行小结:
    1.索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。(InnoDB按照主键进行聚集,如果没有定义主键,InnoDB会试着使用唯一的非空索引来代替。如果没有这种索引,InnoDB就会定义隐藏的主键然后在上面进行聚集。所以,对于 聚集索引 来说,你创建主键的时候,自动就创建了主键的聚集索引。而普通索引就是非聚集索引)
    2.设计索引的一些理论:
     一.只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
     二.一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
     三.MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
     四.建立索引的目的就是帮助查询,如果查寻用不到则索引就没有必要建立,另外如果数据表过大(5w以上)则有些字段(字符型长度超过(40))不适合作为索引,另外如果表是经常需要更新的也不适合做索引
    3.索引(INDEX):INDEX(这是最基本的索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。) UNIQUE(与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似)    
    ps:
    一.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
    二.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!