MySQL - 库表设计之IP和TIMESTAMP的处理
文章目錄
- 學(xué)習(xí)更多干貨
- Pre
- TIMESTAMP
- IP
- 總結(jié)
學(xué)習(xí)更多干貨
帶你搞定MySQL實(shí)戰(zhàn),輕松對(duì)應(yīng)海量業(yè)務(wù)處理及高并發(fā)需求,從容應(yīng)對(duì)大場(chǎng)面試
Pre
MySQL - 高效的設(shè)計(jì)MySQL庫表
設(shè)計(jì)指導(dǎo)思想和注意事項(xiàng)都梳理了一下,那來個(gè)小練習(xí)把
TIMESTAMP
我們使用 MySQL 內(nèi)置的函數(shù)(FROM_UNIXTIME(),UNIX_TIMESTAMP()),可以將日期轉(zhuǎn)化為數(shù)字,用 INT UNSIGNED 存儲(chǔ)日期和時(shí)間
示例
時(shí)間 2020-08-17 22:22:22 與整數(shù)之間的轉(zhuǎn)換,轉(zhuǎn)化后數(shù)字是連續(xù)的,占用空間更小,并且可以使用索引提升查詢性能。
mysql> select UNIX_TIMESTAMP('2020-08-17 22:22:22'); +---------------------------------------+ | UNIX_TIMESTAMP('2020-08-17 22:22:22') | +---------------------------------------+ | 1597674142 | +---------------------------------------+ 1 row in setmysql> select FROM_UNIXTIME(1597674142); +---------------------------+ | FROM_UNIXTIME(1597674142) | +---------------------------+ | 2020-08-17 22:22:22 | +---------------------------+ 1 row in setmysql> mysql> select UNIX_TIMESTAMP(now()); +-----------------------+ | UNIX_TIMESTAMP(now()) | +-----------------------+ | 1597674191 | +-----------------------+ 1 row in setmysql> select FROM_UNIXTIME(1597674191); +---------------------------+ | FROM_UNIXTIME(1597674191) | +---------------------------+ | 2020-08-17 22:23:11 | +---------------------------+ 1 row in setmysql>IP
-
一般使用 Char(15) 進(jìn)行存儲(chǔ),但是當(dāng)進(jìn)行查找和統(tǒng)計(jì)時(shí),字符類型不是很高效。
-
MySQL 數(shù)據(jù)庫內(nèi)置了兩個(gè) IP 相關(guān)的函數(shù) INET_ATON()、INET_NTOA(),可以實(shí)現(xiàn) IP 地址和整數(shù)的項(xiàng)目轉(zhuǎn)換。
因此,我們使用 INT UNSIGNED(占用 4 個(gè)字節(jié))存儲(chǔ) IP,非 Char(15)。占 15 個(gè)字節(jié)。
mysql> select INET_ATON('127.0.0.1'); +------------------------+ | INET_ATON('127.0.0.1') | +------------------------+ | 2130706433 | +------------------------+ 1 row in setmysql> select INET_NTOA(2130706433); +-----------------------+ | INET_NTOA(2130706433) | +-----------------------+ | 127.0.0.1 | +-----------------------+ 1 row in setmysql>將 IP 的存儲(chǔ)從字符型轉(zhuǎn)換成整形,轉(zhuǎn)化后數(shù)字是連續(xù)的,提高了查詢性能,使查詢更快,占用空間更小。
總結(jié)
以高性能為目標(biāo),庫表設(shè)計(jì)以范式為主,根據(jù)特殊業(yè)務(wù)場(chǎng)景使用反范式,允許必要的空間換時(shí)間。
規(guī)范數(shù)據(jù)庫的使用原則,統(tǒng)一規(guī)范命名,減少性能隱患,減少隱式轉(zhuǎn)換。
高性能表設(shè)計(jì)的原則:合適的字段、合適的長(zhǎng)度、NOT NULL。
從不同角度思考 IP、timestamp 的轉(zhuǎn)換,拓寬設(shè)計(jì)思路。
規(guī)范的命名可提高可讀性,反范式設(shè)計(jì)可提高查詢性能。
總結(jié)
以上是生活随笔為你收集整理的MySQL - 库表设计之IP和TIMESTAMP的处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL - 高效的设计MySQL库表
- 下一篇: [并发编程] - 操作系统底层工作原理