精华内容
下载资源
问答
  • 今天有位自己填上一坑:mysql储存引擎原因就是数据库表引擎为:...如果还是不行:删除外键表数据,建立外键索引,再次建立主外键关系。 再次将数据添加回去。转载于:http://blog.csdn.net/xifeijian/article/deta...

    今天有位自己填上一坑:mysql储存引擎

    原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB;

    解决方案:alter  table table_name1  engine=innodb;改变两个表的引擎;

    如果还是不行:删除外键表数据,建立外键索引,再次建立主外键关系。 再次将数据添加回去。

    转载于:http://blog.csdn.net/xifeijian/article/details/20316775;

    MyISAM 和InnoDB 讲解

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

    以下是一些细节和具体实现的差别:

    ◆1.InnoDB不支持FULLTEXT类型的索引。

    ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

    ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

    ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

    ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

    另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

    两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

    作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。

    原因如下:

    1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。

    2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

    3、经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为最小的一个数据库实例的数据量基本都是几十G大小。

    4、从接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

    5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

    6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

    7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

    当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。

    展开全文
  • title: 数据库的主键外键索引 date: 2018-04-08 16:03:01 uodated: 2020-03-07 14:05:24 categories: 数据库 tags: - 数据库 这是一篇数据库的主键、外键、索引的学习笔记 数据库的主键外键索引 主键、外键和索引...

    title: 数据库的主键外键索引
    date: 2018-04-08 16:03:01
    uodated: 2020-03-07 14:05:24
    categories: 数据库
    tags:
    - 数据库


    这是一篇数据库的主键、外键、索引的学习笔记

    数据库的主键外键索引

    主键、外键和索引的区别?

    主键 外键 索引
    定义 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值
    作用 用来保证数据完整性 用来和其他表建立联系用的
    个数 主键只能有一个 一个表可以有多个外键

    聚集索引和非聚集索引的区别?

    聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。

    聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。

    mysql中key 、primary key 、unique key 与index区别

    来源:mysql中key 、primary key 、unique key 与index区别 + mysql中key 、primary key 、unique key 与index区别 + MySQL 索引-菜鸟教程

    • key的用途:主要是用来加快查询速度的。

    • unique Key是唯一键,而Primary key是主键
      Primary key 与Unique Key都是唯一性约束。但二者有很大的区别:

      1、Primary key的1个或多个列 必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。

      2、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。

    • MySQL 中Index 与Key 的区别:

      key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)

      index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;
      因此,索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。如,create table t(id int, index inx_tx_id (id));

      请详看key和index区别

      Key即键值,是关系模型理论中的一部份,比如有主键(Primary Key),外键(Foreign Key)等,用于数据完整性检否与唯一性约束等。

      而Index则处于实现层面,比如可以对表的任意列建立索引,那么当建立索引的列处于SQL语句中的Where条件中时,就可以得到快速的数据定位,从而快速检索。

      至于Unique Index,则只是属于Index中的一种而已,建立了Unique Index表示此列数据不可重复,猜想MySQL对Unique Index类型的索引可以做进一步特殊优化吧。

      于是乎,在设计表的时候,Key只是要处于模型层面的,而当需要进行查询优化,则对相关列建立索引即可。

      另外,在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique Index,无需重复再在上面建立索引了。

      总结: (1).我们说索引分类,分为主键索引、唯一索引、普通索引(这才是纯粹的index)等,也是基于是不是把index看作了key。
      比如 create table t(id int, unique index inx_tx_id (id)); --index当作了key使用

      (2).最重要的也就是,不管如何描述,理解index是纯粹的index,还是被当作key,当作key时则会有两种意义或起两种作用。

    展开全文
  • 关于MySQL 外键索引

    千次阅读 2017-07-16 00:22:58
    关于MySQL 外键索引的几种情况的分析

    1、什么时候需要用到外键索引呢?

    答:A表中存在唯一索引id_a,B表中的字段包含id_a,由于B表自身已经有主键索引,此时如果将字段id_a设置为外键索引索引(foreign key),则建立外键索引。

    使用场景:

    1)父表更新时,子表也更新;父表删除时,如果

    2)子表有匹配的项,则删除失败。

    (3)父表更新时,子表也更新;父表删除时子表匹配的项也删除。

    即:使用外键可以使得修改或者删除的级联操作的日常维护工作更加轻松。

     

    2、创建语法

    [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name(index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]

    reference_option:

    RESTRICT | CASCADE | SET NULL | NO ACTION

    (外键值最直接的作用)如果子表试图创建一个父表不存在的外键值,InnoDB会拒绝任何INSERT或者UPDATE操作。

    如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。

    InnoDB支持以下几种动作类型,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RETRICT:

    (1)CASCADE:顾名思义:级联,从父表中删除或者更新对应的行,同时自动的删除或者更新子表中匹配的行。如:ON DELETE CANSCADE和ON UPDATE CANSCADE。(最有用

    (2)SET NULL:从父表中删除或更新对应的行,同时将子表中的外键列设置为空。注意,这些在外键列没有被设为NOT NULL时才生效。如:ON DELETE SET NULL和ON UPDATE SET NULL。

    (3)NO ACTION:

    (4)RESTRICT:拒绝删除或者更新父表。(默认

    举个栗子:

    建立表province:

    CREATE TABLE `province` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      PRIMARY KEY (`id`)

    )ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;

    建立表student:

    CREATE TABLE `student` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      `pid` smallint(6) DEFAULT NULL,

      PRIMARY KEY (`id`),

      KEY `pik_fk` (`pid`),

      CONSTRAINT `pik_fk` FOREIGN KEY (`pid`) REFERENCES `province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

    )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    上述student表中已经建立了外键级联索引(包括delete cascade 和 update cascade)

    这里,先介绍下如何删除外键索引:可以看到建立外键索引产生了两个属性一个是字段pid被设置为索引,而且还加了一个约束属性。

    删除的操作:

    (1)dorp table student drop foreign key pik_fk;

    (2)drop table student drop key pik_fk;

    注意:需要分别执行两次pik_fk的操作。

    执行上述操作之后,表结构如下:

    CREATE TABLE `student` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      `pid` smallint(6) DEFAULT NULL,

      PRIMARY KEY (`id`)

    )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    需求一:现在需要增加一个外键索引,当该外键对应的父表删除掉主键id,则对于的该表中关联的字段也要一起删除掉。增加如下:

    alter table student add constraint pid_fk foreign key (pid) references province (id) on delete cascade on update cascade;

    则添加外键索引:

    CREATE TABLE `student` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      `pid` smallint(6) DEFAULT NULL,

      PRIMARY KEY (`id`),

      KEY `pid_fk` (`pid`),

      CONSTRAINT `pid_fk` FOREIGN KEY (`pid`) REFERENCES `province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

    )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    此时,如果执行删除province中某条记录,则会删除student中所有有关联该条记录主键的记录。如果更新province中主键id,则会更新所有student中原有表对应的外键id。

    需求二:如果删除各province中的主键id,则student中中外键pid将相应更改为null。

    alter table student add constraint pid_fk foreign key (pid) references province (id) on delete set null on update set null;

    需求三:如果province中的主键id在student中外键pid中存在,则不允许进行删除和更改操作。

    alter table student add constraint pid_fk foreign key (pid) references province (id) on delete RESTRICT on update RESTRICT;

    外键索引的缺点:

    由于加了约束,因此操作变慢了。

    展开全文
  • 简单一句话,默认生成的外键索引没有存在的必要,删除就好了,不然反而会降低新增和更新服务性能 1、数据库初始化时,经常因为pd里配置的外键关系会除了外键之外还会建立上外键索引外键索引是否有存在的必要呢? ...

    简单一句话,默认生成的外键索引没有存在的必要,删除就好了,不然反而会降低新增和更新服务性能

    1、数据库初始化时,经常因为pd里配置的外键关系会除了外键之外还会建立上外键索引,外键索引是否有存在的必要呢?

    2、外键索引经验证-增加了与不增加查询效果相同,有些默认初始化数据库时,会自动建立的外键索引可以去掉。

     

     

    转载于:https://my.oschina.net/rifa/blog/1587380

    展开全文
  • phpadmin添加外键索引

    千次阅读 2017-01-05 11:35:50
    phpadmin 给某个表的某个字段添加外键索引 选中数据库  修改字段的sql语句如下:  ALTER TABLE 表名(主表) ADD FROEIGN KEY (主表中作为外键的字段名) REFERENCES 表2 外键字段在表2中的字段名 表1 student  id ...
  • MySQL普通索引、唯一索引、主索引、外键索引、复合索引、全文索引的使用
  • Mysql中的外键索引

    2018-09-10 21:48:18
    外键索引(foreign key) 作用:让当前表的字段值在另一个表的范围内选择。 注意规则: 1.主表的被参考字段和从表的参考字段的数据类型应该相同 2.主表中的参考字段必须是KEY的一种,通常是主键。 mysql&...
  • 主键 外键 索引

    2017-11-30 20:17:05
    外键索引作为表与表之间的联系枢纽,大家对此褒贬不一,很多人已弃用外键索引,而是在代码层面进行表与表之间的关联。 主键(primary key) 主键能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但...
  • 主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引外键(foreign key)是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间...
  • 主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。2、外键(foreign key)是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表...
  • 主键:主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int(10...
  • 概述最近运维人员在去掉了一些外键索引的时候,隔天发现数据库多了很多告警,提示enq:TM-contention,下面记录一下问题发生及解决的过程。1、监控异常隔天我从数据库监控系统发现XX数据库多了很多这类型等待事件,...
  • insert into tmp_p values (100001,100001);commitSQL> delete fromtmp_p where pk =100001;已删除1行。执行计划----------------------------------------------------------Plan hash value: 797653082--------...
  • I've just created my first mySQL table on my own (other than using Joomla, Wordpress, etc.) and I am MS SQL developer for years but normally I can easily create a foreign key in MS SQL but I came acro...
  • 导读在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别?上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别。1、主键索引主键索引,简称主键,原文是PRIMARY KEY...
  • mysql外键索引

    2015-08-07 16:42:15
    mysql在创建外键的时候会自动添加索引,oracle就不会,这样避免了死锁的产生,提高查询效率 mysql> create table f(id int primary key); Query OK, 0 rows affected (0.05 sec) mysql> create table c(id ...
  • 我在为mysql数据库中的现有表创建外键时遇到一些问题。我有experiment表:+-------------+------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------------+----...
  • MYSQL -外键索引

    千次阅读 2019-03-08 20:15:23
    9:59 2019/3/8/周五 ...数据库之间的关联数据库(通过外键来约束) 比如一个表中的key_id和另一个表classcharge的id之间有关联,这个时候应该在里面加入{ foreign key(key_id) references class...
  • 朋友问了一个问题:首先,外键什么情况下采用呢?外键是否采用看业务应用场景,以及开发成本的1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不...
  • MySQL 主键 外键 索引

    2018-06-18 20:36:52
    主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int...
  • ①参照列没有索引的话,MySQL会自动创建索引,因为参照列含有主键,创建主键时MySQL会默认创建所用; ②外键列的索引也是MySQL根据参照列自动创建的。 转载于:https://my...
  • mysql不让删外键是因为在创建外键后,会自动建一个同名的索引,而在删除外键时,这个同名索引如果没被删,则mysql认为外键仍然存在,那么mysql会在show keys命令里继续显示外键。有时候我们无法删除mysql外键,该...
  • Mysql外键bitsCN.commysql修改索引时,外键约束造成的奇怪问题事情是这样的,在Windows的mysql5.5 ,我想修改一个表的索引,于是执行[sql]ALTER TABLE practice_log DROP INDEX ix_practice_log_userid;ALTER TABLE ...
  • Oracle 索引监控与外键索引

    千次阅读 2013-03-29 10:49:56
    Oracle 监控索引特性为我们提供了一个大致...其次对于存在子表存在外键的情形,对于主表进行操作时是否会导致索引被监控呢?下面描述的是这个话题。 1、普通监控索引的情形--演示环境 SQL> select * from v$version
  • 主键: 可以唯一标识一条记录的属性组,组代表可以是...索引和目录的原理很相似,索引表中关键字可以看作标题,索引中的地址【某一行数据的指针】可以看作对应的页码。 本质上是一种数据结构。 转载于:https://...
  • 主键外键索引说明

    2017-12-13 10:00:00
    一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的...
  • 外键索引检查

    2011-04-29 17:49:00
    外键列上缺失索引会带来两个问题: 1.主子表关联查询时,会对子表进行全表扫描 2.主表删除记时,子表会被锁住。 <br />鉴于以上两个原因,我们会选择浪费一些存储空间,在外键上创建索引 ...
  • MySQL主键 外键 索引

    2017-09-07 17:23:00
    一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • 这篇文章写的很好 https://blog.csdn.net/bingqingsuimeng/article/details/51595560

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,996
精华内容 2,798
关键字:

外键索引