设为首页 收藏本站
查看: 750|回复: 0

[经验分享] 初识Mysql(二)

[复制链接]

尚未签到

发表于 2018-10-6 12:27:57 | 显示全部楼层 |阅读模式

1 mysql索引

2 主键的使用(primary key)

3 外键(foreign key)

4 存储引擎
1 mysql索引
  1.1 索引概述
  相当与“书的目录”
  1.2 索引优点与缺点
  优点:加快查询的速度
  缺点:占用物理存储空间;减慢写的速度;
  1.3 使用索引
  在表中的字段上创建索引
  普通索引 index
  规则:一个表中可以有多个index字段;字段的值允许重复,可以赋空值
  key标志是MUL
  index_type:BTREE(二叉树)  ;B+TREE ;Hash
  Key_name: abc  #索引名称
  Column_name: std_id  #字段名
  show index from 表名\G;#查看索引详细信息\分行
  创建索引:
  创建时指定索引字段:
  create table 表名(字段1,字段2, ...index(字段1),index(字段2) );
  已有表中指定索引字段:
  create index 索引名 on 表名(字段名);
  删除索引:
  drop index 索引名 on 表名;
  1.4 唯一索引(unique)
  一个表中可以有多个unique字段;
  对应的字段值不允许重复;
  KEY的标志是UNI;
  字段的值允许为NULL,当修改为不允许为NULL,则此字段限制与主键相同
  创建唯一索引:
  创建时指定索引字段:
  create table 表名(字段1,字段2, ... unique(字段1),unique(字段2) );
  已有表中指定索引字段:
  create unique index 索引名 on 表名(字段名);
  案例:新建table t27表,字段名为姓名,护照,驾驶证
  mysql> create table t27(name char(10),
  -> passport_id char(5),
  -> drive_id char(5),
  -> unique(passport_id),
  -> unique(drive_id);
  此时 desc t27 显示的Key为UNI
  mysql> insert into t27 values("bob","aaa","bbb");
  mysql> insert into t27 values("bob","asaa","sbbb");
  passport_id列的值 ,drive_id列值各自不能相同
  mysql> insert into t27 values("lisi",null,null);  #不允许赋空值
  ERROR 1048 (23000): Column 'passport_id' cannot be null

  mysql>>  此时 desc t27 显示的passport_id Key为PRI

  mysql>>  mysql> drop index passport_id on t27; #使用该命令删除
2 主键的使用(primary key)
  2.1 使用规则
  一个表中只能有一个主键字段;
  对应的字段值不允许有重复,且不允许赋NULL值;
  如果有多个字段都作为primary key,称为复合主键,必须一起创建;
  主键的标志是PRI;
  通常与auto_increment连用。
  2.2 创建
  建表时创建:
  create table 表名(字段1  primary key, ...);
  create table 表名(字段1 ,字段2, ... primary key(字段));
  在已有表中设置主键(考虑创建主键的条件,原字段为空,但是主键不允许为空)
  alter table 表名 add primary key(字段名);
  2.3 删除主键:
  alter table 表名 drop primary key;
  2.4 复合主键
  复合主键字段的值不允许同时重复;
  必须同时创建;
  建表时创建:
  create table 表名(字段1 ,字段2, ... primary key(字段1,字段2));
  在已有表中设置主键(考虑创建主键的条件)
  alter table 表名 add primary key(字段名);
  删除复合主键
  alter table 表名 drop primary key;
  2.5 primary key与auto_increment连用
  字段的值自动增长i++;
  案例:
  mysql> create table t26(id int(1) zerofill
  primary key  auto_increment,
  -> name char(10),
  -> age tinyint(2) unsigned,
  -> sex enum("boy","girl")
  -> );
  mysql> insert into t26(name,age,sex) values("jim",18,"boy");
  总结:id值不设置时,默认1,添加的自增加1;如果自己设置从最后的值+1
3 外键(foreign key)
  3.1 外键
  让当前表字段的值在另一个表中字段值的范围内选择。
  使用外键的条件:
  表的存储引擎必须是innodb;
  字段类型要一致;
  被参考字段必须要是索引类型的一种(如:primary key).
  3.2 创建外键:
  foreign key(字段名)  references  表名(字段名)
  on update cascade 同步更新  on delete cascade  同步删除
  已有表创建外键
  alter table 表名 add foreign key(字段名)  references  表名(字段名)
  on update cascade  on delete cascade;
  3.3 删除外键:
  alter table 表名 drop foreign key 约束名;
  案例:创建2个表,分别为财务表和班级表,财务表记录了整个年级学生的缴费情况,
  如果想要统计班级内的学生的缴费情况,只需要查看std_id,
  没有缴费的学生在班级表内就写不进去信息。
  mysql> create table finace(std_id int(2) primary key auto_increment,
  -> name char(10),
  -> money float(7,2) default 5000)
  -> engine=innodb;
  mysql> create table stdinfo(std_id  int(2),
  -> name char(10),
  -> money float(7,2) default 5000,
  -> foreign key(std_id) references finace(std_id)
  on update cascade on delete cascade)engine=innodb;
  对finace表写入数据,stdinfo表的std_id范围必须在finace表的std_id范围内,
  且stdinfo表的std_id字段值会随着finace表的std_id的字段值改变而改变。
  (从属表随着主表改变,主表不会随从属表改变)
  update finace set std_id=新值 where std_id=旧值;
  delete from finace where std_id=值;
  3.4 show create table 表名; #查看建表命令
  | stdinfo | CREATE TABLE `stdinfo` (
  `std_id` int(2) DEFAULT NULL,
  `name` char(10) DEFAULT NULL,
  `money` enum('yes','no') DEFAULT 'no',
  KEY `std_id` (`std_id`),
  CONSTRAINT `stdinfo_ibfk_1` FOREIGN KEY (`std_id`) REFERENCES `finace` (`std_id`) ON DELETE CASCADE ON UPDATE CASCADE
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  删除外键字段:
  alter table 表名 drop foreign key 约束名;
  alter table stdinfo drop foreign key stdinfo_ibfk_1;
4 存储引擎
  4.1 mysql存储引擎介绍
  是数据库服务自带的功能程序,处理表的处理器;
  存储方式不一样(在/var/lib/mysql/数据库名/ 内存放的数据格式不同)
  4.2 查看
  查看表使用的存储引擎:show create table 表名;
  查看系统的存储引擎:show engines; 或show engines\G;
  4.3 修改
  修改默认使用的存储引擎:
  vim /etc/my.cnf
  [mysqld]
  default-storage-engine=myisam
  systemctl restart mysqld
  建表指定使用的存储引擎:
  create table 表名(字段...)engine=引擎;
  已有表修改:
  alter table 表名 engine=引擎;
  4.4 常用的存储引擎以及特点
  4.4.1 mysql锁的机制:
  锁粒度
  表级锁:一次直接对整张表进行加锁;
  行级锁:只锁定某一行;
  页级锁:对整个页面进行加锁;
  锁类型
  读锁(共享锁):支持并发读;
  写锁(互斥锁):是独占锁,上锁期间其他线程不能读表或写表;
  4.4.2 myisam:
  支持表级锁定,不支持行级锁定;
  不支持事务;独享表空间;多用在查询,插入操作较多的表;
  数据存储方式:
  3个表文件:包括xxx.frm:存放表结构;xxx.MYI:存放索引;xxx.MYD:存放数据
  4.4.3 innodb:
  支持表级/行级锁定;
  支持外键,支持事务回滚;共享表空间;
  #事务(一次sql操作连接到断开的过程,要么成功,要么失败)
  #事务回滚(事务执行过程,任意一步执行不成功,会恢复所有操作)
  #innodb存储引擎的表使用事务文件记录执行过的sql操作,
  #在/var/lib/mysql/下的ib_logfile0 和ib_logfile1  ibdata1
  数据存储方式:
  2个表文件:包括:xxx.frm:存放表结构;xxx.ibd:存放索引和数据
  4.4.4 查看锁的状态
  show status like ‘Table_lock%’;# %作为通佩符
  4.5 建表时如何决定表使用哪种存储引擎
  接收查访问多的表,适合使用myisam存储,节省系统资源。
  接收写访问多的表,适合使用innodb存储,并发访问量大。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-613797-1-1.html 上篇帖子: 初识Mysql(一) 下篇帖子: 初识Mysql(三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表