【引言】

今天中午项目组来一需求,欲在MySQL环境的某张表下创建几个BTREE索引。要创建索引,首先需要了解基表的表结构,以及已经包含的索引。Oracle的表结构大家都很熟悉,但MySQL表结构和已创建索引的查看怎么操作,本文将一一讲述。

文章大纲

1.Oracle如何查看表结构和索引

2.MySQL如何查看表结构和索引

3.结语

一、Oracle如何查看表结构和索引

先来回顾下Oracle是如何查看表结构及表索引

首先查看oracle数据库的单个表结构

使用Oracle的package包进行查看,其语法如下:

DBMS_METADATA.GET_DDL (

object_type IN VARCHAR2,

name IN VARCHAR2,

schema IN VARCHAR2 DEFAULT NULL,

version IN VARCHAR2 DEFAULT ‘COMPATIBLE’,

model IN VARCHAR2 DEFAULT ‘ORACLE’,

transform IN VARCHAR2 DEFAULT ‘DDL’)

RETURN CLOB;

官方示例如下:

Example: Fetch the DDL for all Complete Tables in the Current Schema, Filter Out Nested Tables and Overflow Segments

This example fetches the DDL for all "complete" tables in the current schema, filtering out nested tables and overflow segments. The example uses SET_TRANSFORM_PARAM (with the handle value = DBMS_METADATA.SESSION_TRANSFORM meaning "for the current session") to specify that storage clauses are not to be returned in the SQL DDL. Afterwards, the example resets the session-level parameters to their defaults.

To generate complete, uninterrupted output, set the PAGESIZE to 0 and set LONG to some large number, as shown, before executing your query.

SET LONG 2000000

SET PAGESIZE 0

EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);

SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)

FROM USER_ALL_TABLES u

WHERE u.nested='NO'

AND (u.iot_type is null or u.iot_type='IOT');

EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT');

这里我们使用简单操作,命令如下

SQL> SELECT DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME,’SCHEMA’) FROM DUAL;

注意:

参数’TABLE’是要查询的对象,因要查的是表结构,所以是’TABLE’;

参数TABLE_NAME是要查的表名,注意表名必须大写;

参数’SCHEMA’为表所属的属主,也需要大写

注意:执行完上面这条语句你可能只是看到整个建表语句的一部分;要生成完整的、不间断的输出,在执行查询之前,将PAGESIZE设置为0并将LONG设置为较大的数字,如下所示。

SQL> SET LONG 2000000

SQL> SET PAGESIZE 0

SQL> SELECT DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME,’SCHEMA’) FROM DUAL;

2. 查看Oracle的表所包含的索引

如使用用户账号登陆,则查询user_indexes

SQL> select * from user_indexes where table_name=upper(‘table_name’);

如果是使用sys账号登陆,则查询dba_indexes

SQL> select * from user_indexes where table_name=upper(‘table_name’);

注意:upper函数将实现小写转换成大写。

3. 根据上述索引名查看索引基于的字段/属性列

SQL> select * from dba_ind_columns where index_name = upper('index_name');

索引名大写或者通过upper函数转换成大写。

至此,Oracle环境下如何查看表结构和其所基于的索引介绍完毕。

接下来,再看MySQL环境下如何查看表结构和索引。

二、MySQL环境下如何查看表结构和索引

MySQL环境下,你会发现查询语句简单的令人发指;简单如下:

mysql> use schema_name;

–查看表结构定义

mysql> SHOW create table table_name \G;

–查看表上的索引有哪些

mysql> SHOW INDEX FROM table_name \G

或者再简单点,用如下一天命令一次查清楚基于某表的索引

mysql> SHOW INDEX FROM mydb.mytable;

即结束了。

很惊喜,很意外,很舒爽。

为避免Oracle介绍重,MySQL轻的嫌疑,这里具体介绍下官网中MySQL的索引部分。

MySQL官网查看索引的语法:

SHOW INDEX Syntax

SHOW [EXTENDED] {INDEX | INDEXES | KEYS}

{FROM | IN} tbl_name

[{FROM | IN} db_name]

[WHERE expr]

示例如下:

mysql> show indexes IN my_schema.`ethan_table` \G

*************************** 1. row ***************************

Table: ethan_table

Non_unique: 1

Key_name: idx_ethan_table

Seq_in_index: 1

Column_name: order_id

Collation: A

Cardinality: 368831

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

Visible: YES

Expression: NULL

2 rows in set (0.00 sec)

该图可以看出,key_name“ idx_ethan_table”即是索引的名称,是基于表ethan_table的属性列order_id创建,类型BTREE索引。

SHOW INDEX返回以下主要字段介绍如下:

Non_unique

如果索引不能包含重复项,则为0;如果可以,则为1。

Key_name

索引的名称。如果索引是主键,那么名称总是主键。

Seq_in_index

索引中的列序列号,从1开始。

Column_name

列名。

Collation

列在索引中的排序方式。它可以有值A(升序)、D(降序)或NULL(未排序)。

Cardinality

对索引中惟一值数目的估计。要更新这个数字,运行ANALYZE TABLE或(对于MyISAM表)myisamchk -a。

基数是基于存储为整数的统计数据进行计数的,因此即使对于小表,这个值也不一定是精确的。基数越高,MySQL在执行连接时使用索引的机会越大。

Sub_part

该指数前缀。也就是说,如果只对列进行部分索引,则索引字符的数量;如果对整个列进行索引,则为NULL。

注意

前缀限制以字节为单位度量。但是,CREATE TABLE、ALTER TABLE和CREATE index语句中索引规范的前缀长度被解释为非二进制字符串类型(CHAR、VARCHAR、TEXT)的字符数和二进制字符串类型(binary、VARBINARY、BLOB)的字节数。在为使用多字节字符集的非二进制字符串列指定前缀长度时,要考虑到这一点。

Packed

指示如何包装密钥。如果不是,则为空。

Null

如果列可能包含空值,则包含“是”;如果不包含空值,则包含“否”。

Index_type

使用的索引方法(BTREE、FULLTEXT、HASH、RTREE)。

Comment

在它自己的列中没有描述的关于索引的信息,例如,如果索引被禁用,则禁用索引。

Index_comment

在创建索引时使用comment属性为索引提供的任何注释。

Visible

索引是否对优化器可见。

Expression

MySQL 8.0.13及更高版本支持函数关键部分(参见函数关键部分),它同时影响Column_name和表达式列:

对于非功能性键部件,Column_name表示由键部件索引的列,表达式为NULL。

对于功能性键部件,Column_name列为NULL,而Expression表示键部件的表达式。

关于表索引的信息也可以从INFORMATION_SCHEMA统计表中获得。隐藏索引的扩展信息只能通过显示扩展索引来实现;它不能从统计表中获得。

可以使用**shell> mysqlshow [options] [db_name [tbl_name [col_name]]]**命令列出表的索引。

示例如下:

shell> mysqlshow -k -uroot -p my_schema ethan_table order_id

至此,MySQL环境下如何查看表结构和其所基于的索引介绍完毕。

【结语】

1.本文回顾了Oracle环境下如何查看表结构和其所基于的索引,以及MySQL下的更为人性、简单的查看语句;

2.MySQL 8.0.13以后,可以使用shell> mysqlshow [options] [db_name [tbl_name [col_name]]]命令列出表的索引;

3.感悟,熟悉Oracle和MySQL的亲可能已经深有体会,MySQL在语句的简洁性、易用性上下了很大的工夫,不同于Oracle的语句那么复杂,之前自己在“我的DBA之路”中也说过一段话:“Oracle自治带来的门槛并不意味着成为高级Oracle DBA的拿督降低”;但学好Oracle,对其他数据库的设计理念和原理会帮助甚多。

【参考】

https://dev.mysql.com/doc/refman/8.0/en/show-index.html

【参考】

https://www.cnblogs.com/JokerShi/p/8087112.html

mysql生产环境加索引_【生产篇】_MySQL环境下如何查看基于表的索引定义相关推荐

  1. 开发环境和运行环境的区别_生产环境 VS 开发环境,关于Kubernetes的四大认识误区...

    来源:http://t.cn/ExaHoL2 最近我们澄清了一些大家在进行Kubernetes实验的时候所见到的常见的误解.其中最大的一个误解就是:在生产环境中运行Kubernetes和开发测试环境并 ...

  2. 生产排程系统_生产计划排程APS系统中排产算法的探讨

    点击上方 MES百科 关注我们 e-works鼓励原创,如需投稿请参看首页"原创投稿"说明. ✎导 读 生产计划排程既有相对简单的算法,例如,最短交货期算法,最短工序算法等,也有复 ...

  3. option:contains后面加变量_什么是配置环境变量,配置以后有什么作用呢?

    python为什么要配置环境变量? 1.什么是环境变量 引用百度百科里面的解释:环境变量是在操作系统(windows10,windows8,windows7,windowsXP都属于操作系统只不过版本 ...

  4. 生产管理软件实施流程_生产管理软件实施过程会遇到哪些问题?

    随着我国工业化和信息化的快速发展,各种各样的企业管理信息系统得到了广泛的应用,企业管理系统从最初的MRP(物料需求计划)系统发展成MRPⅡ(制造资源计划)系统进而发展成为高度集成的生产管理软件(企业资 ...

  5. elasticsearch删除索引_一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)

    在 Elasticsearch 中,索引是一个非常重要的概念,它是具有相同结构的文档集合.类比关系型数据库,比如 Mysql, 你可以把它对标看成和库同级别的概念. 今天小哈将带着大家了解, 在 El ...

  6. jre环境变量配置_详解java环境变量意思-用于解决环境搭建问题

    这一期教程主要针对于百度了一大圈也没有解决java环境变量配置问题的人,本期教程看完你多多少少都该有所学会. 环境变量配置你看着很复杂,其实它很简单. java环境配置好了后用cmd试下命令看出不出数 ...

  7. 找到符合条件的索引_程序员写了多年CRUD,总结出数据库索引这几点值得注意...

    索引,被称之为数据库的目录,可以让我们快速地找到对应的数据.但是,索引其实是一把双刃剑,如果使用不合理,不仅查询数据的速度不会变快,反而适得其反,让查询变慢. 工作原理 索引是对数据库表中一列或多列的 ...

  8. python在d盘增加环境变量配置_怎样配置Python环境变量

    展开全部 第一步:制 找到你的python安装的目录 比如我的bai安装在D盘的python 2.7文件du夹zhi下面,我就dao找到这个文件夹. 然后复制这个文件地址 CTRL+C复制. 第二步: ...

  9. 在…视域下是什么意思_语篇视域下汉译英中的意群翻译

    语篇视域下汉译英中的意群翻译 潘 蕾 [摘 要] 在语篇视域下确定意群如何翻译是在保证语意连贯.结构合理的基础 上分析如何恰当地切分意群,使译文更符合译入语的表达习惯和思维逻辑.以 鲁迅小说的两个译本 ...

最新文章

  1. Hopfiled 神经网络实例解释
  2. 基于 gulp 的 fancybox 源码压缩
  3. java web七:http协议
  4. POJ 2296 Map Labeler(2-sat)
  5. Anaconda简介及其下载 安装 配置 使用 卸载
  6. 实时对讲是怎么发起的_QQ可实时显示手机电量并展示给好友 近半投票者支持该功能...
  7. handsome对应php文件,handsome主题魔改教程
  8. 引入Spacy模块出错—OSError: [E941] Can‘t find model ‘en‘.
  9. Android之使用getIdentifier()获取资源Id
  10. url 特殊字符 传递参数解决方法
  11. python2和python3的默认编码_python2和python3哪个版本新
  12. 泛型技巧系列:类型字典和Type Traits
  13. Python3文本读写操作
  14. ajax nginx 转发 sessionid_「查缺补漏」巩固你的Nginx知识体系
  15. 时间+地区 选择器
  16. 【笔记整理】电磁场复习——麦克斯韦四个方程组
  17. 几种不同的方式用Python连接数据库
  18. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。五 (下)京东后台提交订单,通知用户...
  19. 网易MUMU模拟器怎么设置不卡?
  20. Maya 2023安装步骤(附安装、汉化、图文教程)

热门文章

  1. 作为一个算法攻城狮,你训练的算法翻车了该怎么办?
  2. kail利用msf工具对MS12-020漏洞进行渗透测试
  3. 中专计算机专业学c语言吗,中专计算机专业学什么 有哪些课程
  4. php投票系统中各个文件的作用说明,PHP开发简单投票系统之投票页面功能模块(二)...
  5. Promise实战AJAX封装
  6. async,await
  7. react如何监听路由url变化
  8. Spring boot 上传文件大小限制
  9. 【[SHOI2015]超能粒子炮·改】
  10. 从计算机体系结构方面思考深度学习