mysql外键索引的建立(建表时)和查看

索引的意义就不说了,参考其他资料,总之就是大大加快查询的速度。牺牲了小部分物理空间,毕竟索引也是要存的。(B+树原理)

所以设计索引的时候尽量做到区分度好,例如默认情况下主键就是一个索引。
经典的多对多学生选课模型,学生表students,课表courses,学生选课表sc
实体联系模型
CREATE TABLE student (
Sno varchar(20) NOT NULL,
Sname varchar(30) DEFAULT NULL,
Ssex varchar(2) DEFAULT NULL,
Sage int(11) DEFAULT NULL,
Sdept varchar(30) DEFAULT NULL,
PRIMARY KEY (Sno)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这里可以用 show index from student 来查看索引
查询结果

  1. Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。这里是主键,所以肯定是0啦
  2. Seq_in_index 索引中的列序列号,从1开始。这里sno是第一列,所以是1
  3. Collation 列以什么方式存储在索引中。有值‘A’(升序)或NULL(无分类)。
  4. Cardinality 索引中唯一值的数目的估计值。 我的表里大概有39个,随时变动。
  5. Sub_part    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
  6. Packed    指示关键字如何被压缩。如果没有被压缩,则为NULL。
  7. Null     如果列是否含有Null值
  8. Index_type   用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
  9. comment 注释什么的

课程表
CREATE TABLE course (
Cno varchar(10) NOT NULL,
Cname varchar(30) DEFAULT NULL,
Chour int(11) DEFAULT NULL,
Ccredit varchar(30) DEFAULT NULL,
Cpno varchar(10) DEFAULT NULL,
PRIMARY KEY (Cno)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

学生选课表的建立:

  CREATE TABLE `sc`(
      `Sno` varchar(20) NOT NULL,
      `Cno` varchar(10) NOT NULL,
      `Grade` int(11) DEFAULT NULL,
      PRIMARY KEY (`Sno`,`Cno`), 
      FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`),
      FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看sc表的索引
      这里很奇怪,为什么只有外键Cno有索引而Sno没有?研究一番发现复合索引的事。
     复合索引有最左原则,例如创建一个(a,b,c)索引,就相当于创建了(a),(a,b),(a,b,c)三个索引,如果我们的where语句中有a = … and b = …时也能用上,但是b = … and c = … 就用不上索引。所以设计复合索引的时候最常用的列名应该放在较前面的位置,这里 a 应该是常用的查询属性。

这里我们的主键是两个列,组成一个复合索引,即(sno,cno),相当于(sno),(sno,cno),所以我们看到,外键自动创建的索引只有(cno),因为(sno)已经有过啦

当然你也可以强制加索引,但是不建议,因为索引使用不当有很多缺点。
CREATE TABLE sc (
Sno varchar(20) NOT NULL,
Cno varchar(10) NOT NULL,
Grade int(11) DEFAULT NULL,
PRIMARY KEY (Sno,Cno),
KEY Cno (Cno),
KEY Sno (Sno),
CONSTRAINT sc_ibfk_4 FOREIGN KEY (Sno) REFERENCES student (Sno),
CONSTRAINT sc_ibfk_5 FOREIGN KEY (Cno) REFERENCES course (Cno)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这时候的索引
详细内容参考链接

https://www.cnblogs.com/chenshishuo/p/5030029.html

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Hive 建表的语法和 MySQL建表语法类似,但是有些细节上的差异。 下面是一个 Hive 建表的例子: ``` CREATE TABLE example_table ( id INT, name STRING, age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; ``` 这个例子中,首先指定了表的名称 `example_table`,然后指定了表的列及其数据类型。在 Hive 中,每个列都必须指定其数据类型,否则会报错。 接下来,使用了 `ROW FORMAT DELIMITED` 来指定数据行的分隔符,这里使用的是制表符 `\t`。然后使用了 `FIELDS TERMINATED BY` 来指定列之间的分隔符,这里同样使用了制表符。 最后,使用 `STORED AS` 来指定数据存储格式,这里使用的是文本格式 `TEXTFILE`。在 Hive 中还支持其他的存储格式,例如 ORC、Parquet 等。 ### 回答2: Hive建表MySQL是有一些相似之处的,主要体现在以下几个方面: 数据模型:Hive和MySQL都支持使用关系型数据模型来建立和管理数据。在两者中都可以定义表,表中有行和列,可以对表进行增删改查等操作。 数据类型:在Hive和MySQL中都有一些相似的数据类型,例如整数、浮点数、字符串等。这些数据类型可以用来定义表中的列。 表结构定义:在Hive和MySQL中,都可以通过CREATE TABLE语句来定义表的结构。定义需要指定表名、列名、数据类型等信息,这些定义的方式在两者中非常相似。 数据存储:在Hive和MySQL中,表的数据都是存储在文件或者目录中。Hive将数据存储在Hadoop分布式文件系统(HDFS)中,而MySQL存储在本地的文件系统中。 查询语言:在Hive和MySQL中,都可以使用SQL来进行查询。虽然Hive的查询语言稍有不同,需要通过HiveQL来进行,但是也能够进行类似于MySQL的查询操作。 然而,Hive和MySQL之间也存在一些差异,主要体现在以下几个方面: 底层架构:Hive是建立在Hadoop生态系统之上的,而MySQL是一个独立的关系型数据库管理系统。因此,Hive在底层架构和数据存储上与MySQL有着显著的差异。 数据处理方式:Hive是为大规模数据处理而设计的,通常用于数据仓库和批量处理。而MySQL是一个面向在线事务处理(OLTP)的数据库系统,适用于实性要求较高的应用。 性能差异:由于底层架构和数据处理方式的不同,Hive在查询性能方面通常不如MySQL。Hive的查询需要通过将SQL转化为MapReduce任务来完成,而MySQL可以直接在索引上进行查询,因此在小规模和实性要求较高的情况下,MySQL的性能更优。 综上所述,虽然Hive建表MySQL有一些相似之处,但是在底层架构、数据处理方式和性能方面存在较大差异。因此,在选择使用哪种数据库系统,需要根据具体的需求场景来做出决策。 ### 回答3: Hive建表MySQL在某些方面是一致的,但也存在一些不同之处。 首先,两者都使用结构化查询语言(SQL)来创建表和定义表的结构。无论是在Hive还是MySQL中,都可以使用类似的语法来声明列的名称、数据类型和约束。 其次,Hive和MySQL都可以用来创建具有主键、外键索引和唯一约束等约束条件的表。这些约束条件可以保证数据的完整性和一致性,确保表中的数据满足特定的要求。 然而,Hive建表MySQL在以下几个方面存在一些区别。 首先,Hive是为大数据处理而设计的分布式数据仓库解决方案,而MySQL是一种关系型数据库管理系统。Hive建表,可以选择将表存储在Hadoop分布式文件系统(HDFS)上,而MySQL则将表存储在磁盘上。这种底层存储的差异导致了Hive和MySQL在数据处理和查询性能上的差异。 其次,Hive建表的语法更加灵活,支持分区、分桶和存储格式的自定义。分区可以提高查询性能,并允许根据数据的某个属性对表进行分割。分桶则可以进一步细分分区,提高查询效率。此外,Hive还支持不同的存储格式,如文本、Parquet和ORC等,根据数据类型和查询需求进行存储优化。 最后,Hive建表可以使用HiveQL,这是类似SQL的查询语言,但不是完全兼容。它具有自己的特定语法和函数,用于处理大规模数据和分布式计算。相比之下,MySQL使用标准SQL语法,更适合于小型和中型数据库的管理和查询。 综上所述,虽然Hive建表MySQL在某些方面是一致的,但也存在一些区别。这取决于数据处理需求和规模,可以根据具体情况选择使用Hive还是MySQL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值