<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Database on Winterfall</title>
    <link>https://blog.hulb.club/categories/database/</link>
    <description>Recent content in Database on Winterfall</description>
    <image>
      <title>Winterfall</title>
      <url>https://avatars2.githubusercontent.com/u/7296536</url>
      <link>https://avatars2.githubusercontent.com/u/7296536</link>
    </image>
    <generator>Hugo -- 0.128.0</generator>
    <language>en</language>
    <lastBuildDate>Sun, 24 Apr 2022 00:04:16 +0800</lastBuildDate>
    <atom:link href="https://blog.hulb.club/categories/database/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Go使用mysql和Postgres的时区问题</title>
      <link>https://blog.hulb.club/posts/go-mysql-postgres-timezone/</link>
      <pubDate>Sun, 24 Apr 2022 00:04:16 +0800</pubDate>
      <guid>https://blog.hulb.club/posts/go-mysql-postgres-timezone/</guid>
      <description>使用mysql或postgres数据库来处理时间类型的数据时，经常会要处理时区的问题。对于go开发而言，这两个数据库对时区的处理并不一样，这里做一个简单总结。
myql 时区配置 mysql会根据当前时区对timestamp类型的写入和读取进行处理。mysql维护了三种时区，即系统时区(对应变量system_time_zone)，当前时区(对应变量time_zone)，以及会话时区。（https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html）
系统时区：当mysql server启动时，会获取当前操作系统时区，将该时区设置为 system_time_zone 系统变量；如果要明确设置时区可以通过设置TZ环境变量之后再启动mysqld; 如果使用mysqld_safe启动服务，可以通过--timezone参数设置 当前时区：全局系统变量time_zone指明当前mysql服务端所用的时区。初始值是SYSTEM,表明使用操作系统时区。全局服务端时区可以在启动服务时通过命令行参数--default-time-zone指定默认值; 如果当前用户具有SYSTEM_VARIABLES_ADMIN权限，也可以通过SET GLOBAL time_zone = timezone语句来设置当前全局时区。 会话时区：每个client连接会话有它自己的时区设置，默认取全局时区，也可以通过SET time_zone = timezone语句来设置。 查询当前mysql时区配置 通过一下语句
SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; 可以看到当前的全局时区和会话时区，默认情况下会得到：
mysql&amp;gt; SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; +--------------------+---------------------+ | @@GLOBAL.time_zone | @@SESSION.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 通过查看timezone相关mysql系统变量可以看到当前系统时区和当前时区。
show variables like &amp;#39;%time_zone%&amp;#39;; 默认情况下会得到：
mysql&amp;gt; show variables like &amp;#39;%time_zone%&amp;#39;; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ timestamp类型 mysql 的timestamp类型支持是不带时区的。mysql来处理写入时会将对写入数据做时区转换，转成UTC来存储；读出时会将UTC存储的数据转为当前时区。也就是说mysql中存储的永远会是UTC时区，而不管当前mysql使用的是什么时区。 例如</description>
    </item>
    <item>
      <title>Mongodb 索引介绍（一）</title>
      <link>https://blog.hulb.club/posts/mongo-index-1/</link>
      <pubDate>Sun, 27 Feb 2022 22:33:16 +0800</pubDate>
      <guid>https://blog.hulb.club/posts/mongo-index-1/</guid>
      <description>index作为数据库不可缺少的一部分可以极大加速数据查询，这里记录下Mongodb中的index类型和一些要点。以下内容基于Mongodb 4.0文档.
索引创建 Mongodb支持通过createIndex函数创建索引, 创建时可以指定一些options:
background: 默认false, 是否后台创建；默认情况下在建立索引期间，Mongodb为了更快速地构建更有效的索引会阻止所有对集合的读写访问；后台创建索引构建速度较慢，且结构稍不理想，但允许在构建过程中对数据库进行读写 unique： 默认false, 是否唯一；如果唯一，将不能插入或更新与已经存在的文档中索引字段值相同的文档。 name： 索引名称，如不指定Mongodb默认按照索引字段和排序方向生成索引名称 partialFilterExpression： 部分过滤表达式，当指定部分过滤表达式时，Mongodb将只对满足过滤条件的文档字段进行索引。 expireAfterSeconds： 设置TTL index的过期时间 storageEngine: 存储引擎，可以通过这个参数执行存储引擎，4.0版本Mongodb支持两种存储引擎：WiredTiger(默认), 内存存储引擎 除了createIndex外，还可以通过createIndexes批量创建索引。创建示例：
db.collection.createIndex( { &amp;#34;user_id&amp;#34;: 1} ) 字段的值1表示升序，-1表示降序。
Mongodb index类型 mongodb 有以下几种index类型：
单字段索引(single field index) 过期索引 地理空间索引(Geospatial Index) 哈希索引(hash index) 复合索引(compound index) 多值索引(multikey index) 文本索引(text index) 这里暂时把地理空间索引和文本索引放一边，主要看看复合索引，多值索引和过期索引。
单字段索引 single field index索引中_id index是Mongodb自动创建的一个特殊索引，每个文档都会有一个_id字段，Mongodb会自动对这个字段进行索引。用户可以创建自己的单字段索引，索引顺序无关紧要，因为Mongodb可以从任何排序遍历索引。
过期索引 TTL index是特殊的单字段索引，Mongodb会自动根据TTL设置删除过期的文档，在创建时需要指定一个时间类型字段或一个包含时间类型值的数组字段,然后通过options指定过期时间。例如：
db.eventlog.createIndex( { &amp;#34;lastModifiedDate&amp;#34;: 1 }, { expireAfterSeconds: 3600 } ) 这样设置以后，在lastModifiedDate+3600s时间段后Mongodb将会删除这些过期的文档。删除操作是通过Mongodb的后台线程执行的，当TTL 线程启动后可以通过db.currentOp()或数据库profiler查看。
一旦Mongodb在mongodb的主要节点上完成索引创建即会开始执行过期文档的清理，但是TTL index并不能保证过期时间一到，过期的文档会立即被删除，这中间会有一点延时。Mongodb每60秒运行一次后台过期清理任务，但由于清理时长取决于Mongodb的负载，过期的文档可能会存在时间超过60s.
过期索引具有几个限制：</description>
    </item>
  </channel>
</rss>
