如何在表中建立空字段?

Drill好像国内使用的很少,根据定义,Drill是一个低延迟的分布式海量数据交互式查询引擎,支持多种数据源,包括hadoop,NoSQL存储等等。

需要使用SQL语句,在建表时加上 check (字段名>0 and 字段名<100)。

clickhouse建表语句_clickhouse创建数据库clickhouse建表语句_clickhouse创建数据库


clickhouse建表语句_clickhouse创建数据库


举例如下:

Create Table Biao( CJ Number(3),check(CJ>'0' and CJ<'100'));

SQL即结构化查询语言,SQL是专为数据库而建立的作命令集,是一种功能齐全的数据库语言。

扩展资料:

删除表

drop table tabname--这是将表连同表中信息一起删除但是日志文件中会有记录

删除信息

delete from table_name-这是将表中信息删除但是会保留这个表

创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

参考资料来源:设置联合索引时,值越多的,越应该放在“左侧”。

参考资料来源:

GBASE 8s 如何创建数据空间&建立分片表?

(Con CHAR(4),

建立分片空间

建立空文件在数据库存储文件。

touch $GBASEDBTDIR/storage/datadbs01

使用onspaces语句将该空文件设置为数据库存储空间。

onspaces -c datadbs01 -p $GBASEDBTDIR/storage/datadbs01 -o 0 -s 800000 -k 2k

更改该文件的属主属组。

chown gbasedbt:gbasedbt $GBASEDBTDIR/storage/datCreate Table 表名 (字段名1 Int Not Null,adbs01

更改改文件权限。

chmod 660 $GBASEDBTDIR/storage/datadbs01

分片表建表语句

这样分片表以及分片存储的空间就建好了。

15个MySQL常用基本SQL语句

SSL加密:如果数据源要求使用SSL加密连接,则需要开启此选项。

在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL 等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。

3 val VARCHAR(10),

在MySQL中,数据库称为database,数据表称为table,一个数据库软件中有多个数据库(databases),每个数据库中又可以有多个数据表(tables),最终,数据是存储在数据表中。

数据库和数据表之间的关系可以用下面这个图来表示,对于一个数据库来说,有多个数据表。

在正式开始写SQL语句之前,需要说明两点。

这里通过MySQL Workbench来写SQL代码,在Workbench中,执行一条SQL语句的方式有两种。

了解了这之后,接下来介绍一些常见的命令,分两部分:数据库常用命令和数据表常用命令。

1、查看有哪些数据库

2、创建数据库

创建一个名为Testdb的数据库。

3、创建数据库并指定编码格式

有些时候,为了防止中文乱码,创建数据库的时候需要指定编码格式。

4、使用某个数据库

使用mydb这个数据库,或者进入mydb这个数据库。

5、删除数据库

删除Testdb这个数据库。

1、查看有哪些数据表

进入某个数据库之后,想查看有哪些数据表,SQL语句为:

mydb是一个新建的数据库,所以自然是没有数据表。

2、创建数据表

建表SQL语句格式为:

说明: 每个字段以逗号分隔,一个字段不加逗号。

例如,给定一个学员信息表,如下表所示。

根据以上表格,建表SQL语句如下。

以上语句中,primary key表示主键,意思是这个字段作为记录的标识,就像每个人的号,都是确定的。

3、查看表结构

查看表结构的SQL命令为:

执行该命令会显示表stu的基本结构,例如有哪些字段,每个字段是什么类型,谁是主键等。

4、修改数据表

修改数据表通过drop子句进行,比如,建完表后,想增加一个字段,SQL语句的格式为:

想在指定位置增加一个字段,例如,在某个字段后增加一个字段,SQL语句的格式为:

如果在某个字段之前增加字段,用before即可。

例如,在字段age后增加一个字段major(专业),SQL语句为:

如果要删除major这个字段,通过drop子句,SQL语句为:

5、重命名表

重命名表通过alter+rename来实现,SQL语句格式为:

这里为了不影响之前创建的表,我们创建一个新表,SQL语句如下。

以上创建一个名为stuInfoTest的表,现在想将它的名称改成stutest1,SQL语句为:

6、删除数据表

删除数据表通过drop进行,SQL语句格式为:

例如,删除数据表stutest1,SQL语句为:

7、插入记录

此时的表stu是空的,没有数据,我们要向表中插入记录。

插入记录通过insert into进行,SQL语句格式为:

例如,向表stu插入一条记录,SQL语句为:

注意:上方是一条SQL语句,为了可读性换行,记住一条SQL语句默认以分号结尾。

如果需要一次性插入多条记录,SQL语句格式为:

例如,向表stu再插入两条记录,SQL语句为:

注意:如果设置了主键,插入记录的主键字段是不能重复的,也就是不能插入重复的记录。

作业:大家可以按照上述方法将上面的学员信息表中的所有记录都插入表stu中。

8、查询记录

有了数据之后,就可以查询记录了,查询记录通过select子句进行。

例如,想查询表stu中的所有记录,SQL语句为:

执行之后,就可以看到表stu中的所有记录了。

例如,想查询stuid为20161001的记录,SQL语句为:

9、删除记录

删除记录通过delete子句进行,SQL语句格式为:

例如,想删除stuid为20161002的记录,SQL语句为:

10、修改记录

修改记录通过update子句进行,update就是更新的意思,SQL语句格式为:

例如,想将学号(stuid)为20161001的记录的姓名(stuname)更新为Jack,SQL语句为:

以上,就是MySQL中的基本SQL语句。

创建数据库 完整语句

2 id INT,

SQL CREATE DATABASE 语句

CREATE DATABASE 语句用于创建数据库。

SQL CREATE DATABASE 语法

SQL CREATE DATABASE 实例

下面的 SQL 语句创建一个名为 “my_db” 的数据库:

from shulanxt

数据库表可以通过 CREATE TABLE 语句来添加。

举例:

--建库

create database mydb

--use mydb 注:每一次建表都使用一下本句(才具为在新创建的数据库下建表)

--建表

create table card

[name] varchar(20),

class varchar(20)

)create table books

(bno varchar(20) primary key,

bname varchar(20),

pr money,

quantity int

)create table borrow

(cno varchar(20),

bno varchar(20),

rdate datetime,

primary key(cno,bno),注:这里是双主键

foreign key(cno) references card(cno),

foreign key(bno) references books(bno)

)

去查MSDN,完整的不能再完整了。

USE ;

GO

CREATE DATABASE Sales

ON

( NAME = Sales_d如果在查询结果中,带有大对象数据类型或者Long数据类型的数据,则这个语句就会执行不成功。at,

FILENAME = 'C:Program FilesMicrosoft SQL MSSQL10.MSSQLSERVERMSSQLDATAsaledat.mdf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 )

LOG ON

( NAME = Sales_log,

FILENAME = 'C:Program FilesMicrosoft SQL MSSQL10.MSSQLSERVERMSSQLDATAsalelog.ldf',

SIZE = 5MB,

MAXSIZE = 25MB,

FILEGROWTH = 5MB ) ;

GO

----------------------------------------------------

create database stuDB 建库

技术选型 - OLAP大数据技术哪家强?

在利用子查询来创建新表的时候,数据库可以修改新表中列的名称,但是不能够修改列的数据类型和长度。新表中所有列的数据类型和长度必须与查询列一致。

Lambda架构的核心理念是“流批一体化”,因为随着机器性能和数据框架的不断完善,用户其实不关心底层是如何运行的,批处理也好,流式处理也罢,能按照统一的模型返回结果就可以了,这就是Lambda架构诞生的原因。现在很多应用,例如Spark和Flink,都支持这种结构,也就是数据进入平台后,可以选择批处理运行,也可以选择流式处理运行,但不管怎样,一致性都是相同的。

技巧一:使用Nologging选项提高建表效率。

Kylin

Kylin的主要特点是预计算,提前计算好各个cube,这样的优点是查询快速,秒级延迟;缺点也非常明显,灵活性不足,无法做一些 探索 式的,关联性的数据分析。

适合的场景也是比较固定的,场景清晰的地方。

ClickHouse

Clickhouse由yandex公司开发。专为在线数据分析而设计。

Clickhouse的特点首先是快 ,为了快采用了列式储存,列式储存更好的支持压缩,压缩后的数据传输量变小,所以更快;同时支持分片,支持分布式执行,支持SQL。

ClickHouse很轻量级,支持数据压缩和最终数据一致性,其数据量级在PB级别。

另外Clickhouse不是为关联分析而生,所以多表关联支持的不太好。

同样Clickhouse不能修改或者删除数据,仅能用于批量删除或修改。没有完整的事务支持,不支持二级索引等等,缺点也非常明显。

与Kylin相比ClickHouse更加的灵活,sql支持的更好,但是相比Kylin,ClickHouse不支持大并发,也就是不能很多访问同时在线。

总之ClickHouse用于在线数据分析,支持功能简单。CPU 利用率高,速度极快。的场景用于行为统计分析。

Hive

Hive这个工具,大家一定很熟悉,大数据仓库的工具。可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能。

主要功能是可以将sql语句转换为相对应的MapReduce任务进行运行,这样可能处理海量的数据批量,

Hive与HDFS结合紧密,在大数据开始初期,提供一种直接使用sql就能访问HDFS的方案,摆脱了写MapReduce任务的方式,极大的降低了大数据的门槛。

当然Hive的缺点非常明显,定义的是分钟级别的查询延迟,估计都是在比较理想的情况。 但是作为数据仓库的每日批量工具,的确是一个稳定合格的产品。

Presto

Presto极大的改进了Hive的查询速度,而且Presto 本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询,支持包括复杂查询、聚合、连接等等。

Presto没有使用MapReduce,它是通过一个定制的查询和执行引擎来完成的。它的所有的查询处理是在内存中,这也是它的性能很高的一个主要原因。

Presto由于是基于内存的,缺点可能是多张大表关联作时易引起内存溢出错误。

另外Presto不支持OLTP的场景,所以不要把Presto当做数据库来使用。

Presto相比ClickHouse优点主要是多表join效果好。相比ClickHouse的支持功能简单,场景支持单一,Presto支持复杂的查询,应用范围更广。

Impala

Impala是Cloudera 公司推出,提供对 HDFS、Hbase 数据的高性能、低延迟的交互式 SQL 查询功能。

Impala 使用 Hive的元数据, 完全在内存中计算。是CDH 平台的 PB 级大数据实时查询分析引擎。

Impala 的缺点也很明显,首先依赖Hive,而且稳定性也稍,元数据需要单独的mysql/pgsql来存储,对数据源的支持比较少,很多nosql是不支持的。但是,估计是cloudera的国内市场推广做的不错,Impala在国内的市场不错。

SparkSQL

SparkSQL的前身是Shark,它将 SQL 查询与 Spark 程序无缝集成,可以将结构化数据作为 Spark 的 RDD 进行查询。

SparkSQL后续不再受限于Hive,只是兼容Hive。

SparkSQL提供了sql访问和API访问的接口。

支持访问各式各样的数据源,包括Hive, Avro, Parquet, ORC, JSON, and JDBC。

Drill

除了支持多种的数据源,Drill跟BI工具集成比较好。

Druid

Druid是专为海量数据集上的做高性能 OLAP而设计的数据存储和分析系统。

Druid的核心设计结合了数据仓库,时间序列数据库和搜索系统的思想,以创建一个统一的系统,用于针对各种用例的实时分析。Druid将这三个系统中每个系统的关键特征合并到其接收层,存储格式,查询层和核心体系结构中。

目前 Druid 的去重都是非的,Druid 适合处理星型模型的数据,不支持关联作。也不支持数据的更新。

Druid的优点还是支持实时与查询功能,解约了很多开发工作。

Kudu

kudu是一套完全的分布式存储引擎,很多设计概念上借鉴了HBase,但是又跟HBase不同,不需要HDFS,通过raft做数据;分片策略支持keyrange和hash等多种。

数据格式在parquet基础上做了些修改,支持二级索引,更像一个列式存储,而不是HBase schema-free的kv方式。

kudu相对于原有parquet和ORC格式主要还是做增量更新的。

Hbase

Hbase使用的很广,更多的是作为一个KV数据库来使用,查询的速度很快。

Hawq

Hawq是一个Hadoop原生大规模并行SQL分析引擎,Hawq采用 MPP 架构,改进了针对 Hadoop 的基于成本的查询优化器。

网站用户提交的文件怎么直接导入数据库

kudu也是cloudera主导的项目,跟Impala结合比较好,通过impala可以支持update作。

导入数据方法如下:

首先对需求进行分析,按照传统模式,可以采用POI+JDBC的方式来进行导入数据。但是这种方式比较繁琐,同时插入效率在数据量很大时,相对来说还是不够高。还有一种更方便快速的方式实现该功能执行这个命令,再通过describe查看表结构,会发现表中多了一个字段major。,就是利用Clickhouse自有的插入数据功能,类似于Mysql的load data语法实现的快速导入大批量数据的功能。

数据库(DataBase,DB)是按照数据结构来组织、存储和管理数据的仓库。随着信息技术和市场的发展,特别是20世纪90年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统,在各个方面都得到了广泛的应用。

数据库是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据。它是一个按数据结构来存储和管理数据的计算机软件系统。也就是说,数据库包含有两种含义:保管数据的“仓库”,以及管理数据的方法和技术。

怎样查看oracle中创建建表的sql语句

author varchar(20),

打开PL/SQL Dloper,找到tables底下对应的表,右键选择“查看”菜单,右下角有个“查看SQL”的按钮,点下就可以看到建表语句了。或者“新建”-->“SQL窗口”,然后输入就在引号中间加个空格吧!这样就可以了,其实没必要手动加个 default '',它和系统默认的null是一样的——在没加空格的时候!表名,右键选择“查看”菜单,再点击“查看SQL”按钮。

数据库建表年龄设置15到50

登录NineData控制台。

在Oracle数据库中,可以利用Create Table语句中嵌套子查询来实现基于已有的表或者视图来创建新表。这个功能可能对于大部分用户来说,不会感到陌生。但是在使用这个语句的过程中,需要遵循哪些限制条件呢?对于这一点,可能不少数据库没有一个清晰的认识。

from score

为此,笔者就在这里给大家总结一下,利用查询来创建表时需要遵守的一些限制。

限制条件一:不能够改变数据类型与长度。

如数据库从一个员工信息表中获取员工姓名、员工出生日期等信息创建一个新表。如果在员工信息表中员工出生日期是一个日期型的字段,那么在新表中就必须也是日期型的数据类型。在创建新表的过程中,数据库不能够修改数据类型。

那么如果系统需要更改数据类型,如想把日期型的数据调整为字符型的数据,难道就没有其他办法了吗?其实,通过一些其他方法,这个需求仍然可以实现。

上面的限制条件说,新表中的数据类型必须与查询列中的数据类型相同,而不是说跟基表中的数据类型相同。为此如果数据库想要把日期型的数据(基表中的数据类型)调整为字符型的数据类型(新表中的数据类型),那么只需要在查询语句中,利用日期字符转换函数,将日期型的数据转换为字符型的数据即可。

在创建新表时,数据类型是以查询列为准,而不是以基表中列的数据类型为准。所以通过在查询语句中使用数据类型转换函数,就可以改变新表中的数据类型。

限制条件二:不能够约束条件与列的默认值。

在基表中,可能某些字段有约束条件,如性约束等等。

某些字段也可能设置了默认值,如系统的当前时间等等。但是,如果利用子查询来创建信标的话,那么这些字段的约束条件、默认值等等都不会在新表中体现出来。也就是说,这些内容需要数据库在新表创建后手工重新建立。如果有需要的话,要对照基表的约束条件与默认值,分别在新表的字段中进行定义。

这个没有取巧的方法。至少到限制为止,笔者还没有找到可以利用其他方法来突破这个限制。为此数据库在利用子查询来创建这个新表的时候,要特别注意这个约束条件。特别是默认值,不少在利用这个方法创建新表后,会忘记重新设置相关列的默认值。

限制条件三:不能够为新表指定表空间。

在正常情况下,利用Create创建表的时候,数据库可以为表指定其所属的表空间。如果不指定的话,则其默认情况下采用的是当前用户的默认表空间。但是在使用查询来创建新表的时候,在语句中不能够为新表指定表空间。如使用TableSpace关键字为其指定表空间的话,则系统会提示错误信息:SQL命令未正确结束。

注意这并不是说这个SQL语句哪里有问题,而是指不能够在这种方式下为新表指定表空间。从这里也可以看出,Oracle数据库系统的错误提示还是有模棱两可的地方,还需要改进,即错误信息要能够反映出真实的问题所在。因为不能够为新表指定表空间,此时其所属的表空间就是执行这条语句的用户的默认表空间。

那么数据库就可以通过采用不同的用户来为新表指定所属的表空间。如现在数据库要想把这个新表放置在sales表空间下。那么就可以新建一个用户或者利用原有的用户,先把这个用户的默认表空间设置为sales。然后再利用这个用户来执行这条语句(必要的时候可能需要调整这个用户的权限)。

通过这种方式就可以控制这种形式创建新表所属的表空间。俗话说,条条道路通罗马。既然不能够利用直接的方式来为这新表设定表空间,那么就只能够采取这曲线救国的方法了。只要最终能够达到预计的目的就好。

限制条件四:某些数据类型的数据不能够导入。

换句话说,如果采用子查询来创建新表,则在Select语句中就不能够包含大对象数据类型或者Long数据类型。这是Oracle数据库的一种强制性规定。如果确实需要这些数据的话,则可以采用其它的方式来解决。如先不导入这些类型的数据。先利用子查询把表建立起来。

等新表建立完成后。再利用Update关键字结合子查询来更新这些列的数据即可。虽然这么作比较麻烦一点,但是总比不能够实现要好。

在使用这种方法创建新表时,除了要注意上面这些限制条件之外,再掌握下面这些技巧。这有助于提高通过查询来创建新表的利用价值。

Nologging这个可选项相信大部分数据库都知道其作用。但是到真的需要用到这个选项时,很多人就忘记了。这个选项主要是用来控制重做日志的。即在对数据库进行相关的作时,是否需要日志文件中写入相关的记录。

因为日志文件是一把双刃剑。一方面王日志文件中记录所有的作,有利于数据库的安全。当出现一些错误的作时,可以通过恢复事务日志挽回损失。另一方面,由于数据库同时需要更新数据、更新事务日志信息,为此当对数据库进行大批量的作时,就会降低这个作的性能,延长时间。

通过查询来创建新表是也遇到了类似的问题。因为在利用子查询创建新表时,如果不采用这个选项的话,则在新表中每插入一条记录都将会产生重做日志信息,这会占用额外的空间与时间。如果插入的记录比较多的话,这会给数据库的正常运行带来很大的负面影响。在大部分情况下,笔者建议使用Nologging选项来节省创建新表的时间。

因为通过子查询来创建新表,基本上不会对基表的内容产生任何不利的影响。所以即使不用重做日志,也不会带来多大的风险。换句话话说,此时投入与产出不成正比。也就是说,此时牺牲性能,来换取所谓的安全,是不值得的。因为不影响其它表的数据,所以风险基本上就谈不上。

在这种情况下,采用Nologging选项,让数据库在创建记录的时候,不往事务日志中记录信息,以缩短创建新表的时间。笔者认为这是非常明智的做法。

技巧二:利用查询来创建表结构,不导入数据。

有时候我们需要表的结构,而不需要数据。在PL Dloper开发工具中,可以直接某张表。

但是这么作的话,除了会表的结构外,还会把相关的数据都过去。显然,这不符合我们的要求。而表中的纪录比较多的时候,这个作业就会占用比较长的时间与数据库的资源,会给数据库的性能带来不利的影响。那么是否有方法,可以只表的结构,而不导入任何数据呢?

在谈这个解决方案之前,大家先来回顾一下Select语句。

在使用Select语句中,可以带Where条件语句。如果要查询的记录没有一条记录符合Where条件中规定的限制条件时,则在显示窗口,仍然会显示要查询的各个列的名称。但是不会显示任何一条记录。现在要表的结构,而不需要导入任何数据,就可以参考这种实现机制来完成。

其实要实现这个需求的话,数据库就可以利用通过查询来创建新表的方法。如先利用Select语句将相关的列等结构查询出来,然后再在Where查询语句中,设置一些根本不存在的条件。如此的话,最终的新表中就只有表的结构,而没有任何基础表中的纪录。

可见,虽然通过子查询来创建新表是一项比较强大的功能,可以实现一些复杂的管理需求。但是在使用这个功能的时候,上面对这些限制条件数据库要铭记在心。否则的话,很可能在使用这项功能的时候,四处碰壁;或者竹篮子打水一场空。

oracle如何根据一张表的某一列创建另一张表?

create table user 建表

没有这种动态创建表的语句。

只能是通过sql语句获取建表语句。或者使用存储过程创建这个表。

sql语句获取create table的语句:

select 'create table new_tab ('||wm_concat(distinct (kcm)||' number')||' );'

insert into table (课程名) sele如果想查询符合某个条件的记录,就要用到where子句了,SQL格式为:ct kcm from socre

mysql分享建表和索引的几点规范

(cno varchar(20) primary key,

一、 MySQL建表,字段需设置为非空,需设置字段默认值。

在建表语句中直接写:

二、 MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

三、 MySQL建表,如果字段等价于外键,应在该字段加索引。

四、 MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无确使用索引进行关联对比。

五、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。

六、 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引值的索引。

八、 MySQL针对like语法必须如下格式才使用索引:

SELECT FROM t1 WHERE key_col LIKE 'ab%' ;

九、 SELECT COUNT() 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。

十、 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。

十一、 在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

十二、 ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

十三、 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

十四、 JOIN 索引,所有匹配ON和where的字段应建立合适的索引。

十五、 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

十六、 定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。

十七、 定期使用慢日志检查语句,执行explain,分析可能改进的索引。

十八、 条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。

备注

主键的命名采用如下规则:

主键名用pk_开头,后面跟该主键所在的表名。主键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。主键名用小写的英文单词来表示。

外键的命名采用如下规则:

外键名用fk_开头,后面跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名自己用下划线(_)分隔。外键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。外键名用小写的英文单词来表示。

索引的命名采用如下规则:

1)索引名用小写的英文字母和数字表示。索引名的长度不能超过30个字符。

2)主键对应的索引和主键同名。

3)性索引用uni_开头,后面跟表名。一般性索引用ind_开头,后面跟表名。

4)如果索引长度过长,可对表名进行缩写。缩写规则同表名的缩写规则

index 相关语法

CREATE INDEX log_ ON logaudit_log();

show index from logaudit_log

drop index log_request_time on logaudit_log

sql执行效率检测 mysql explain

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:

如:explain select surname,first_name form a,b where a.id=b.id

分析结果形式如下:

table | type | sible_keys | key | key_len | ref | rows | Extra

EXPLAIN列的解释:

table

显示这一行的数据是关于哪张表的

type

这是重要的列,显示连接使用了何种类型。从到最的连接类型为const、eq_reg、ref、range、indexhe和ALL

sible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE

INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len

使用的索引的长度。在不损失性的情况下,长度越短越好

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

rows

MYSQL认为必须检查的用来返回请求数据的行数

Extra

关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

extra列返回的描述的意义

Distinct

一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

Not exists

MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,

就不再搜索了

Range checked for each

Record(index map:#)

没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort

看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

Using index

列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

Using temporary

看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

Where used

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

不同连接类型的解释(按照效率高低的顺序排序)

表只有一行:表。这是const连接类型的特殊情况

const

表中的一个记录的值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待

eq_ref

在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref

这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型依赖于根据索引匹配的记录多少—越少越好

range

这个连接类型使用索引返回一个范围中的行,比如使用>或

1表中包含 10 万条记录,有一个 datetime 类型的字段。

取数据的语句:

SELECT FROM my_table WHERE created_at < '2010-01-20';

用 EXPLAIN 检查,发现 type 是 ALL, key 是 NULL,根本没用上索引。

可以确定的是,created_at 字段设定索引了。

什么原因呢?

用 SELECT COUNT() 看了一下符合 WHERE 条件的记录总数,居然是 6W 多条!!

难怪不用索引,这时用索引毫无意义,就好像 10 万条记录的用户表,有个性别字段,不是男就是女,在这种字段设置索引是错误的决定。

稍微改造一下上述语句:

SELECT FROM my_table WHERE created_at BETWEEN '2009-12-06' AND '2010-01-20';

这回问题解决!

符合条件的记录只有几百条,EXPLAIN 的 type 是 range,key 是 created_at,Extra 是 Using where 。

自己总结个准则,索引的目的就是尽量缩小结果集,这样才能做到快速查询。

6万条记录符合条件,已经超出总记录数的一半,这时索引已经没有意义了,因此 MySQL 放弃使用索引。

这与设置 gender 字段,并加上索引的情况相似,当你要把所有男性记录都选取出来,符合条件的记录数约占总数的一半,MySQL 同样不会使用这个索引。

值越多的字段,使用索引的效果越好。