唯一索引

SQL 创建表

坚强是说给别人听的谎言 提交于 2019-12-03 15:46:57
SQL 创建表是通过SQL CREATE TABLE 语句来实现,该语句是DDL SQL语句 。CREATE TABLE语句用于创建用于存储数据的表。在创建表时,可以为列定义主键、惟一键和外键等完整性约束。完整性约束可以在列级或表级定义。对于不同的RDBMS, CREATE语句的实现和语法是不同的。 CREATE TABLE语句语法 CREATE TABLE table_name (column_name1 datatype, column_name2 datatype,... column_nameN datatype); SQL table_name—是表的名称 column_name1, column_name2 ….-是列的名称 datatype -是列的数据类型,比如char、date、number等 例如:如果要创建employee表,语句应该是这样的: CREATE TABLE employee ( id number(5), name char(20), dept char(10), age number(2), salary number(10), location char(10)); SQL 在Oracle数据库中,整数列的数据类型表示为“number”。在Sybase中,它表示为“int”。 Oracle提供了另一种创建表的方法。 CREATE TABLE

MySQL——通过EXPLAIN分析SQL的执行计划

南笙酒味 提交于 2019-12-03 09:17:34
转自: https://www.cnblogs.com/songwenjie/p/9409852.html 在MySQL中,我们可以通过 EXPLAIN 命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。 下面分别对 EXPLAIN 命令结果的每一列进行说明: select_type :表示SELECT的类型,常见的取值有: 类型 说明 SIMPLE 简单表,不使用表连接或子查询 PRIMARY 主查询,即外层的查询 UNION UNION中的第二个或者后面的查询语句 SUBQUERY 子查询中的第一个 table :输出结果集的表(表别名) type :表示MySQL在表中找到所需行的方式,或者叫访问类型。常见访问类型如下,从上到下,性能由差到最好: ALL 全表扫描 index 索引全扫描 range 索引范围扫描 ref 非唯一索引扫描 eq_ref 唯一索引扫描 const,system 单表最多有一个匹配行 NULL 不用扫描表或索引 type=ALL,全表扫描,MySQL遍历全表来找到匹配行 一般是没有where条件或者where条件没有使用索引的查询语句 EXPLAIN SELECT * FROM customer WHERE active=0; type=index,索引全扫描

MySQL 创建唯一索引忽略对已经重复数据的检查

孤人 提交于 2019-12-03 04:48:54
MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可。 # 重复数据 mysql> select aid,count(aid) as total ,email,tel_no,account_type,exten,passwd from fudao_admin group by user_name having total> 1; +-------+-------+--------------------------+--------+--------------+-------+----------------------------------+ | aid | total | email | tel_no | account_type | exten | passwd | +-------+-------+--------------------------+--------+--------------+-------+----------------------------------+ | 256 | 5 | | | 0 | | | | 4712 | 2 | bin.liu@wenba100.com | 0 | 0 | | 1afc079897c2de73022540f7c31db632 | | 1070 | 2 |

30个Oracle语句优化规则详解

一世执手 提交于 2019-12-03 04:33:13
选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。你当然也在SQL句级或是会话(session)级对其进行覆盖。 为了使用基于成本的优化器(CBO,Cost-Based Optimizer),你必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过,优化器模式将自动成为CBO,反之,数据库将采用RULE形式的优化器。 在缺省情况下,Oracle采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan),你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 访问Table的方式Oracle采用两种访问表中记录的方式: a.全表扫描 全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。 b.

ORACLE SQL性能优化系列

独自空忆成欢 提交于 2019-12-03 03:41:59
ORACLE SQL性能优化系列 (一) 关键字 ORACEL SQL Performance tuning 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL 句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化 器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器. 在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采 用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE

SQLSERVER SQL性能优化

北城以北 提交于 2019-12-03 03:35:07
SQLSERVER SQL 性能优化系列      1. 选择最有效率的表名顺序 ( 只在基于规则的优化器中有效 )       SQLSERVER 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表(基础表 driving table )将被最先处理,在 FROM 子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当 SQLSERVER 处理多个表时,会运用排序及合并的方式连接它们,    首先,扫描第一个表( FROM 子句中最后的那个表 ) 并对记录进行排序;然后扫描第二个表( FROM 子句中最后第二个表 ) ;最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并    例如 : 表 TAB1 16,384 条记录表 TAB2 5 条记录,选择 TAB2 作为基础表 ( 最好的方法 ) select count(*) from tab1,tab2 执行时间 0.96 秒,选择 TAB2 作为基础表 ( 不佳的方法 ) select count(*) from tab2,tab1 执行时间 26.09 秒; 如果有 3 个以上的表连接查询,那就需要选择交叉表( intersection table )作为基础表,交叉表是指那个被其他表所引用的表      例如 :    EMP 表描述了 LOCATION 表和

baidu面试

徘徊边缘 提交于 2019-12-03 01:52:13
下午到了百度大厦感觉这一生有幸再一次来到这里真心高兴。梦开始的地方不能忘。不忘初心方的始终。 第一面 基础知识面试 首先问了hashmap是如何存储数据、找数据的。 第一点,单个数据是什么结构 jdk1.6 transient Entry[] table; hashmap允许key值为空放置 public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; } 这里要注意了,判断相等是首先判断hash值是否相等

MySQL 创建唯一索引忽略对已经重复数据的检查

匿名 (未验证) 提交于 2019-12-02 22:06:11
MySQL 创建唯一索引忽略对已经重复数据的检查 # 重复数据 mysql> select aid,count(aid) as total ,email,tel_no,account_type,exten,passwd from fudao_admin group by user_name having total> 1; +-------+-------+--------------------------+--------+--------------+-------+----------------------------------+ | aid | total | email | tel_no | account_type | exten | passwd | +-------+-------+--------------------------+--------+--------------+-------+----------------------------------+ | 256 | 5 | | | 0 | | | | 4712 | 2 | bin.liu@wenba100.com | 0 | 0 | | 1afc079897c2de73022540f7c31db632 | | 1070 | 2 | feng.wang@wenba100.com | | 0 |

MySQL主键与唯一索引约束

懵懂的女人 提交于 2019-12-02 11:30:20
MySQL主键与唯一索引约束 触发约束检测的时机: insert update 当检测到违反约束时,不同存储引擎的处理动作是不一样的。 如果存储引擎支持事务,SQL会自动回滚。 例子: create table t1 ( id int ( 10 ) primary key ) engine = innodb ; insert into t1 values ( 1 ) ; insert into t1 values ( 1 ) ; 其中第二条insert会因为违反约束,而导致回滚。 通常可以使用: show warnings ; 来查看违反约束后的错误提示。 如果存储引擎不支持事务,SQL的执行会中断,此时可能会导致后续有符合条件的行不被操作,出现不符合预期的结果。 例子: create table t2 ( id int ( 10 ) unique ) engine = MyISAM ; insert into t2 values ( 1 ) ; insert into t2 values ( 5 ) ; insert into t2 values ( 6 ) ; insert into t2 values ( 10 ) ; update t2 set id = id + 1 ; update执行后,猜猜会得到什么结果集? 猜想一:2, 6, 7, 11 猜想二:1, 5, 6,

索引

a 夏天 提交于 2019-12-02 11:14:51
一.什么叫索引: 索引就是类似书的目录,提高检索数据的效率。 索引是系统按照某个具体的算法(哈希,散列,二叉树),将数据从全部数据里进行提取,维护成一个索引文件,然后系统在进行数据查询的时候,发现如果查询条件刚好满足索引条件,就可以从索引文件中快速的定位的数据所在位置。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 ** 二.索引类型包括: 普通索引(index) 对数据没有要求,文件很大,效率比较低,但是查询速度相对较快。 ALTER TABLE 表名字 ADD INDEX index_name ( 需要加索引的列 ) 全文索引(fulltext) 全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建,Sysman支持全文索引。MySQL5.6.后InnoDB引擎也加入了全文索引对文本的内容进行分词,因为MySQL提供了支持中文、日文和韩文的内置全文ngram解析器。 具体化 ALTER TABLE 表名 ADD FULLTEXT ( 需要加索引的列 ) 唯一索引(unique key) 唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值(null)。如果是组合索引,则列值的组合必须唯一。创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。 ALTER TABLE 表名 ADD UNIQUE