[Oracle][Postgresql][mysql]三个数据库产品下表字段存在空值或者为空创建索引是否生效测试

本文通过测试Oracle 11.2、PostgreSQL 10.11和MySQL的索引行为,探讨了在表字段存在空值或空字符串时,创建的索引是否在查询中生效。测试结果显示,MySQL和PostgreSQL在使用等于空字符串或IS NULL条件时可能走索引,而Oracle则不会。

/*  ******************* postgresql 数据库测试开始   ***********************/
 

--本次测试以pg 数据库 10.11版本

postgres=# select version();
                           version
-------------------------------------------------------------
 PostgreSQL 10.11, compiled by Visual C++ build 1800, 64-bit
(1 行记录)


--创建一张测试表

create table t_index_null(id varchar(50),name text);

--造测试数据

insert into t_index_null(id,name)
select t.id,'test'||t.id::varchar
  from (select generate_series as id
          from generate_series(1,100000) ) as t;

--添加一条 id为null的数据  

insert into t_index_null(name) values ('zqw01');

--添加一条 id为空字符的数据  

insert into t_index_null(id,name) values ('','zqw02');

--对 id列 创建索引

create index idx_t_index_null_id on t_index_null(id);


--检锁id=1 的数据,看执行计划是否会走索引,走执行计划

explain analyze 
select id,name
  from t_index_null 
 where id = '1';

                                                            QUERY PLAN
-------------------------------------------------------------------------------------------
 Index Scan using idx_t_index_null_id on t_index_null  (cost=0.29..8.31 rows=1 width=14) (actual time=0.061..0.062 rows=1 loops=1)
   Index Cond: ((id)::text = '1'::text)
 Planning time: 0.289 ms
 Execution time: 0.086 ms
(4 行记录)

 
--检锁id='' (空字符) 的数据,看执行计划是否会走索引,走执行计划

explain analyze 
select id,name
  from t_index_null 
 where id = '';

                                                             QUERY PLAN
-------------------------------------------------------------------------------------------
 Index Scan using idx_t_index_null_id on t_index_null  (cost=0.29..8.31 rows=1 width=14) (actual time=0.050..0.052 rows=1 loops=1)
   Index Cond: ((id)::text = ''::text)
 Planning time: 0.114 ms
 Execution time: 0.078 ms
(4 行记录)


--检锁id is null (空字符) 的数据,看执行计划是否会走索引,走执行计划

explain analyze 
select id,name
  from t_index_null 
 where id is null;
### MySQL 数据库全面知识点总结 以下是关于 MySQL 数据库的全面知识点总结,涵盖了数据库的基础概念、SQL 语句、约束、多表查询、事务处理等多个方面。 --- ### 三级标题:数据库相关概念 1. **数据库** 数据库是一个长期存储数据的容器,按照一定的组织形式保存数据以便高效检索和更新[^1]。 2. **数据库管理系统 (DBMS)** DBMS 是一种软件系统,用于管理和维护数据库MySQL 是一种常用的关系型数据库管理系统(RDBMS)。 3. **SQL** SQL(Structured Query Language)是一种用于操作关系型数据库的标准语言,主要用于查询、插入、更新和删除数据。 4. **常见的 RDBMS** 常见的关系型数据库管理系统包括 MySQLOracle Database、Microsoft SQL Server 和 PostgreSQL 等。 --- ### 三级标题:MySQL 数据库核心内容 #### 目录结构与数据模型 - MySQL 的目录结构主要包括数据文件、日志文件和配置文件等。 - 数据模型基于表格的形式,每张表由行(记录)和列(字段)组成[^1]。 #### SQL 分类 1. **DDL(数据定义语言)** - DDL 操作包括 `CREATE`、`ALTER` 和 `DROP` 等命令,用于定义或修改数据库对象[^1]。 ```sql CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); ``` 2. **DML(数据操纵语言)** - DML 包括 `INSERT`、`UPDATE` 和 `DELETE` 等命令,用于操作表中的数据。 ```sql INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25); UPDATE users SET age = 26 WHERE id = 1; DELETE FROM users WHERE id = 1; ``` 3. **DQL(数据查询语言)** - 查询数据的主要方式是使用 `SELECT` 语句,支持条件过滤 (`WHERE`)、分组 (`GROUP BY`)、排序 (`ORDER BY`) 和分页 (`LIMIT`) 等功能。 ```sql SELECT * FROM users WHERE age > 20 ORDER BY name LIMIT 10; ``` --- ### 三级标题:约束 约束是对表中数据施加的一系列规则,确保数据的完整性和一致性。 1. **非约束 (NOT NULL)** 确保某列允许存在空值[^1]。 2. **唯一约束 (UNIQUE)** 确保某列或多列组合的在整个表中是唯一的。 3. **主键约束 (PRIMARY KEY)** 主键是一列或多列的组合,其在表中具有唯一性且能为。 4. **默认约束 (DEFAULT)** 当插入新记录时,如果未指定某一列的,则使用默认[^1]。 5. **检查约束 (CHECK)** 检查约束限制了某一列允许输入的范围[^1]。 6. **外键约束 (FOREIGN KEY)** 外键建立了一个表与其他表之间的关联关系,通常用于实现参照完整性。 --- ### 三级标题:多表查询 多表查询是指从多个表中提取数据的操作,常用的多表查询方式如下: 1. **内连接 (INNER JOIN)** 返回两个表中共有的记录[^1]。 ```sql SELECT u.name, o.order_id FROM users u INNER JOIN orders o ON u.id = o.user_id; ``` 2. **外连接 (OUTER JOIN)** 左外连接返回左表的所有记录以及右表中存在的对应记录;右外连接则相反。 ```sql SELECT u.name, o.order_id FROM users u LEFT JOIN orders o ON u.id = o.user_id; ``` 3. **子查询** 子查询是在另一个查询内部嵌套的一个查询,常用于复杂逻辑的表达[^1]。 ```sql SELECT name FROM users WHERE id IN (SELECT user_id FROM orders); ``` --- ### 三级标题:事务 事务是一组作为一个单元执行的 SQL 操作,要么全部成功,要么全部失败[^1]。 1. **ACID 特征** - 原子性 (Atomicity): 事务可分割。 - 一致性 (Consistency): 事务前后保持一致状态。 - 隔离性 (Isolation): 并发事务互影响。 - 持久性 (Durability): 成功提交后永久生效。 2. **事务控制语句** - 开始事务: `START TRANSACTION;` - 提交事务: `COMMIT;` - 回滚事务: `ROLLBACK;`[^1] --- ### 三级标题:索引 索引是提高查询效率的重要手段,但也增加了写入成本[^4]。 1. **索引类型** - B+Tree 索引是最常用的索引结构,适用于范围查询和排序。 - Hash 索引适合精确匹配查询,但在范围查询中表现较差[^4]。 2. **创建与管理索引** ```sql -- 创建普通索引 CREATE INDEX idx_name ON table_name(column_name); -- 查看索引 SHOW INDEX FROM table_name; -- 删除索引 DROP INDEX idx_name ON table_name; ``` --- ### 三级标题:高级主题 1. **存储引擎** - InnoDB 支持事务和外键,广泛应用于生产环境[^2]。 - MyISAM 支持事务,但查询速度较快,适合只读场景[^2]。 2. **视图** 视图是一个虚拟表,基于 SQL 查询的结果集构建[^1]。 ```sql CREATE VIEW v_user_orders AS SELECT u.name, o.order_id FROM users u INNER JOIN orders o ON u.id = o.user_id; ``` 3. **触发器** 触发器是在特定事件发生时自动执行的程序片段[^1]。 ```sql CREATE TRIGGER before_insert_users BEFORE INSERT ON users FOR EACH ROW BEGIN IF NEW.age < 0 THEN SET NEW.age = 0; END IF; END; ``` 4. **函数与存储过程** 函数和存储过程封装了复杂的业务逻辑,提高了代码重用率。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值