数据库
文章平均质量分 88
一个技术渣渣
这个作者很懒,什么都没留下…
展开
-
Mysql的索引为什么使用B+树而不使用跳表?
在我们的印象中,mysql数据表里无非就是存储一行行的数据。跟个excel似的。直接遍历这一行行数据,性能就是O(n),比较慢。为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg(n))。但问题就来了,查询数据性能在 lg(n) 级别的数据结构有很多,比如redis的zset里用到的跳表,也是lg(n),并且实现还贼简单。那为什么mysql的索引,不使用跳表呢?我们今天就来聊聊这个话题。B+树的结构之前的一篇文章里,已经提到过B+树的结构了。文章不长,如果没看过,建议原创 2022-04-19 23:36:04 · 153 阅读 · 1 评论 -
MySQL中count(*)比count(1)快?
先说结论:这两个性能差别不大。1.实践我准备了一张有 100W 条数据的表,表结构如下:CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (原创 2022-04-05 22:01:08 · 167 阅读 · 0 评论 -
为什么不建议在MySQL中使用UTF-8?
看到一篇文章讲到emoji文字占4个字节,通常要用utf-8去接收才行,其他编码可能会出错。我突然想到去年操作MySQL把utf8改成utf8mb4的事儿。嗯?他本身不就是utf8编码么!那我当时还改个锤子?难道,MySQL的utf8不是真正的UTF-8编码吗??! 卧槽这。。MySQL有bug!带着疑问查询了很多相关材料,才发现这竟然是MySQL的一个历史遗留问题~~ 我笑了,没想到这么牛B的MySQL也会有这段往事。一、报错将emoji文字直接写入SQL中,执行 insert .原创 2020-11-23 17:13:38 · 273 阅读 · 0 评论 -
MySQL中in到底走不走索引?
explain介绍mysql中explain关键字可以模拟MySQL优化器执行SQL语句,是一个可以很好的分析SQL语句或表结构的性能瓶颈。explain的使用方法:explain + sql语句,下面我们先来执行下explain语句EXPLAIN SELECT * FROM `user` WHERE created_time > "2020-03-08";执行结果如下:可以看到有几个返回参数:id、select_type、table、partitions、type、p.原创 2020-11-08 23:50:03 · 44473 阅读 · 12 评论 -
数据库的事务以及事务隔离级别
学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。事务及其四大特性?事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit),它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。当在数据库中更改数据成...原创 2020-04-28 15:31:43 · 483 阅读 · 1 评论 -
MySQL索引的原理,B+树、聚集索引和二级索引的结构分析
索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。在mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应值,然后根据匹配的索引记录找到对应的行。我们首先了解一下索引的几种类型和索引的结构。索引类型B树大多数存储引擎都支持B树索引。b树通常意味着所有的值都是按顺序存储的,并且每一个叶子也到根的距离相同。B树...原创 2020-04-10 17:25:12 · 604 阅读 · 0 评论 -
MySQL索引失效的情况
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用的第一部分,则不会使用索引(复合索引,索引匹配规则) 3.like查询是以%开头 4.如果列类型是字符串,那一定要...原创 2020-03-28 19:41:40 · 244 阅读 · 0 评论 -
MySQL索引的数据结构及算法原理
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第一部分主...原创 2020-03-13 15:21:51 · 823 阅读 · 0 评论 -
数据库的乐观锁和悲观锁
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理...原创 2020-03-11 17:11:51 · 208 阅读 · 0 评论 -
MySQL索引原理及慢查询优化
一个慢查询引发的思考select count(*) from task where status=2 and operator_id=20839 and operate_time>1371169729 and operate_time<1371174603 and type=2;系统使用者反应有一个功能越来越慢,于是工程...原创 2019-10-09 16:23:50 · 156 阅读 · 0 评论 -
Mysql IN子查询优化
最近项目里有个SQL查询,使用到 in子查询,发现查询很慢,详细如下:1、原始SQL子查询里只查询出5条记录,但外层却对全表做扫描,感觉没用上索引。数据大的时候,可想而知。2、解决方法网上找到有2种方法,试过,均有不错的效果,记录下来。(1)原来的子查询里,再查询一次执行计划如下,查询数据量降低很多,(2)使用 left join注意:小表放前...原创 2019-03-21 16:43:29 · 8839 阅读 · 1 评论 -
MySQL:utf8_bin和utf8_general_ci编码的区别
MySQL中存在多种格式的utf8编码,其中最常见的两种为:utf8_bin utf8_general_ciutf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写;utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感,为utf8默认编码。分析:编码为utf8_bin时,Alex和alex被认为是两个不同的值,区分大小写...原创 2019-03-13 10:27:42 · 1538 阅读 · 0 评论 -
Druid数据库连接池使用
阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好 简单使用介绍Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息全部配置给DataSource对象 下面给出2种配置方法实例:1. 纯Java代码创建dataSource = new DruidDataSource(); dataSourc原创 2016-01-06 17:50:36 · 470 阅读 · 0 评论 -
Oracle SQL性能优化
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表转载 2015-08-19 11:02:44 · 354 阅读 · 0 评论 -
数据库引擎
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。MYSQL的数据库引擎的类型你能用的数据库引擎转载 2014-02-27 10:54:07 · 795 阅读 · 0 评论 -
sql中的group by 和 having 用法解析
group by 有一个原则,就是 select 后面的所有列中,没有使用组函数的列,必须出现在 group by 后面。为什么有这个规则,因为,按group by进行分组的话,能够产生唯一的值,组函数,也叫多行函数,就是给我多条记录,我只会产生一个输出。因此,如果没出现在主函数的列里,也没出现在group by后面,那么,有可能那个字段产生不是唯一的值,就没法一一对应匹配 当转载 2014-02-27 10:54:59 · 1056 阅读 · 0 评论 -
内连接与外连接的区别
(一)内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的 列值。内连接分三种: 1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结 果中列出被连接表中的所有列,包括其中的重复列。 例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: Java代码转载 2014-02-27 10:55:46 · 2203 阅读 · 0 评论 -
Mysql日期和时间函数大全
对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。 这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) select DAYOFWEEK转载 2014-03-27 17:07:24 · 500 阅读 · 0 评论 -
理解数据库范式
一、基础概念要理解范式,首先必须对知道什么是关系数据库,如果你不知道,我可以简单的不能再简单的说一下:关系数据库就是用二维表来保存数据。表和表之间可以……(省略10W字)。然后你应该理解以下概念:实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,不如说“老师与学校的关转载 2014-03-27 17:00:29 · 472 阅读 · 0 评论 -
linux中启动和停止MySQL服务
1. 启动MySQL服务启动MySQL服务的命令为:/etc/init.d/mysqld start命令执行后如图7-5所示,表示启动MySQL服务成功。 (点击查看大图)图7-5 启动MySQL服务也可以用/etc/init.d/mysqld的简化命令启动MySQL服务:servi转载 2014-05-04 12:54:32 · 4337 阅读 · 0 评论 -
mysql触发器的作用及语法
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器的作用:1. 安全性。可以基于数据库的值使用户具有操作数据库的某种权利;可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据;可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。2. 审计。转载 2014-04-19 16:56:31 · 1126 阅读 · 0 评论 -
oracle建立dblink以及建立定时任务
最近在弄一个事,具体是我们要定时插数据到别人的数据库的中间表里首先要做的是建立一个到对方数据库的oracle dblink,这是为了可以访问他们的数据库,这样我们才能将数据插入到他们中间表。所以我们需要他们中间表的数据库的IP、用户、密码、中间表的表名,具体可以查看数据库安装路径下的\product\10.2.0\client_1\network\admin\tnsnames.ora文件例原创 2015-06-17 15:07:21 · 2393 阅读 · 0 评论 -
Oracle同义词创建及其作用
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和试图的功能类似,就是一种映射关系。本文介绍如何创建同义词语句,删除同义词以及查看同义词语句。 oracle的同义词总结: 从字面上理解就是别名的意思,和试图的功能类似。就是一种映射关系。 1.创建同义词语句:create public synonym table_name for user.t转载 2015-06-19 11:32:41 · 557 阅读 · 0 评论 -
SELECT语句逻辑执行顺序 你知道吗?
引言 这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基础的SQL根基。不了解这些,你一直用普通水泥盖房子;掌握这些,你是在用高等水泥盖房子。 然而,就是这么一个小小的知识点,大家可以去调查一下周围的同事朋友,没准你会得到一个“惊喜”。转载 2014-05-09 16:51:26 · 923 阅读 · 0 评论