一、2016 年数据库客户端格局
2016 年的数据库世界:MySQL 仍是事实 OLTP 之王、Redis 已经是缓存标配、SQLite 在移动端大杀四方、MQTT 协议在 IoT 崛起、Elasticsearch 2.x 到 5.x 跨大版本。本文整理 5 款数据库 / 消息客户端的实战用法。
阅读建议:本文面向全栈 / 后端开发者,重点在工具选型 + 性能调优。
二、MySQL 客户端
2.1 命令行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 连接
mysql -h <HOST> -P 3306 -u root -p<password> <DB>
# 常用命令
SHOW DATABASES;
USE mydb;
SHOW TABLES;
DESCRIBE users;
SELECT * FROM users LIMIT 10;
# 导出
mysqldump -h <HOST> -u root -p<password> mydb > backup.sql
# 导入
mysql -h <HOST> -u root -p<password> mydb < backup.sql
# 执行 SQL 文件
mysql -h <HOST> -u root -p<password> mydb < init.sql
|
2.2 GUI 工具对比
| 工具 | 优势 | 价格 |
|---|
| Navicat | 多数据库 / 完整 | 商业付费 |
| DBeaver | 免费开源 / 多数据库 | 开源(EE 收费) |
| MySQL Workbench | 官方 / 建模 | 免费 |
| HeidiSQL | 轻量 | 免费 |
| phpMyAdmin | Web | 免费 |
| DataGrip | JetBrains / 最强 | 商业付费 |
| Sequel Ace | Mac 开源 | 免费 |
2.3 MySQL 8.0 新特性
- 窗口函数(
ROW_NUMBER() OVER) - CTE 公共表表达式(
WITH 子句) - JSON 增强(
JSON_TABLE) - 降序索引
- caching_sha2_password(默认鉴权插件)
2.4 性能调优
慢查询日志:
1
2
3
4
5
| # /etc/my.cnf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
|
索引优化:
1
2
3
4
5
6
7
| -- 查看执行计划
EXPLAIN SELECT * FROM users WHERE email = 'foo@bar.com';
-- 关键字段:type, key, rows, Extra
-- type = ALL: 全表扫描
-- type = ref: 索引扫描
-- type = const: 主键/唯一索引等值
|
连接数:
1
2
3
4
5
| -- 当前连接
SHOW STATUS LIKE 'Threads_connected';
-- 最大连接
SHOW VARIABLES LIKE 'max_connections';
|
三、Redis 客户端
3.1 命令行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| # 连接
redis-cli -h <HOST> -p 6379 -a <password>
# 常用命令
SET user:1 "alice"
GET user:1
DEL user:1
EXISTS user:1
EXPIRE user:1 3600
# 哈希
HSET user:1 name "alice" age 30
HGETALL user:1
# 列表
LPUSH queue:msg "msg1"
RPOP queue:msg
# 集合
SADD tags "java" "redis"
SMEMBERS tags
# 有序集合
ZADD rank 100 "alice" 95 "bob"
ZRANGE rank 0 -1 WITHSCORES
# 管道
echo "PING\nSET k v\nGET k" | redis-cli
|
3.2 GUI 工具对比
| 工具 | 平台 | 价格 |
|---|
| Redis Desktop Manager (RDM) | 跨平台 | 现改名 RESP.app / 商业 |
| Medis | Mac | 开源 |
| Another Redis Desktop Manager | 跨平台 | 开源免费 |
| RedisInsight | 跨平台 | 官方 / 免费 |
| FastoRedis | 跨平台 | 开源 / 商业 |
| Tiny RDM | 新兴 | 国产 / 开源 |
3.3 实战:String 缓存
1
2
3
4
5
6
7
8
| # 设置 5 分钟过期
SET session:user:1001 "<json>" EX 300
# 获取
GET session:user:1001
# 原子递增
INCR counter:views:article:123
|
3.4 实战:List 消息队列
1
2
3
4
5
| # 生产者
LPUSH queue:email "{\"to\":\"a@x.com\",\"subject\":\"hi\"}"
# 消费者
BRPOP queue:email 0 # 阻塞 0 秒直到有数据
|
3.5 性能监控
1
2
3
4
5
6
7
8
9
| # 实时命令
redis-cli MONITOR
# 慢查询
redis-cli SLOWLOG GET 10
# 内存分析
redis-cli MEMORY USAGE mykey
redis-cli INFO MEMORY
|
四、SQLite 客户端
4.1 命令行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 打开 / 创建数据库
sqlite3 mydb.db
# 常用命令
.tables
.schema users
.headers on
.mode column
SELECT * FROM users LIMIT 10;
# 备份
sqlite3 mydb.db ".dump" > backup.sql
# 恢复
sqlite3 newdb.db < backup.sql
|
4.2 GUI 工具
| 工具 | 平台 | 价格 |
|---|
| DB Browser for SQLite | 跨平台 | 免费开源 |
| SQLiteStudio | 跨平台 | 免费 |
| Navicat for SQLite | 跨平台 | 商业 |
| DBeaver | 跨平台 | 开源(EE 收费) |
4.3 DB Browser for SQLite 实战
https://sqlitebrowser.org/:
- 打开 .db 文件
Browse Data → 看表数据Execute SQL → 写 SQLDatabase Structure → 改表结构- Export → CSV / JSON / SQL
4.4 实战:移动端加密数据库
1
2
3
4
5
6
7
8
9
| # Python + SQLite 加密
import sqlite3
from pysqlcipher3 import dbapi2 as sqlcipher
conn = sqlcipher.connect("encrypted.db")
conn.execute("PRAGMA key = 'my-secret-password'")
cursor = conn.cursor()
cursor.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
conn.commit()
|
实战:
- 密码管理器(如 1Password / Bitwarden)
- 本地缓存(Chrome 历史)
- 小工具数据(如 RSS 阅读器)
五、MQTTX 客户端
5.1 MQTT 协议背景
MQTT 1999 年由 IBM 发布,IoT 领域事实标准。核心概念:
- Broker:消息代理(EMQX / Mosquitto)
- Client:发布 / 订阅
- Topic:主题(层级 / 通配符)
- QoS:
- Retain:保留消息
5.2 MQTTX 介绍
MQTTX 是 EMQX 团队开发的跨平台 MQTT 桌面客户端。优势:
- 跨平台(Win / Mac / Linux)
- 支持 MQTT 5.0
- 多连接 / 多主题
- 消息格式化( JSON / Hex**)**
- 脚本化(自动测试)
5.3 安装与连接
https://mqttx.app/:
- 新建连接
- Host:
broker.emqx.io(公共测试) - Port:
1883(TCP)/ 8883(TLS) - Client ID:随机生成
- 订阅:
test/topic - 发布:同主题发
{"hello": "world"}
5.4 实战:本地 Mosquitto 调试
1
2
3
4
5
6
7
8
| # 启动 Mosquitto
mosquitto -p 1883
# 订阅
mosquitto_sub -h 127.0.0.1 -t "test/#" -v
# 发布
mosquitto_pub -h 127.0.0.1 -t "test/foo" -m "hello"
|
MQTTX 中:
- Host:
127.0.0.1 - 订阅:
test/# - 发布:
test/foo + hello
5.5 实战:TLS / 证书
1
2
3
4
5
| MQTTX 高级设置:
- CA File: ca.crt
- Client Cert: client.crt
- Client Key: client.key
- Verify: true
|
5.6 脚本化(自动化测试)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| // MQTTX 脚本:连接 + 订阅 + 验证
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.emqx.io:1883');
client.on('connect', () => {
client.subscribe('test/topic', (err) => {
if (!err) {
client.publish('test/topic', 'hello mqtt');
}
});
});
client.on('message', (topic, message) => {
console.log(`收到: ${message.toString()}`);
client.end();
});
|
六、Elasticsearch 客户端
6.1 协议背景
Elasticsearch 2010 年发布,基于 Lucene 的分布式搜索。2016 年发布 5.0(重大重构)。核心概念:
- Index:索引(类比 MySQL 数据库)
- Type(5.x)/Document(6.x 起弱化 Type):文档
- Mapping:字段类型定义
- Shard / Replica:分片 / 副本
6.2 HTTP API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # 创建索引
curl -X PUT "localhost:9200/my_index"
# 索引文档
curl -X PUT "localhost:9200/my_index/_doc/1" \
-H "Content-Type: application/json" \
-d '{"title": "Hello", "content": "World"}'
# 搜索
curl -X GET "localhost:9200/my_index/_search?q=hello"
# 复杂搜索(DSL)
curl -X GET "localhost:9200/my_index/_search" \
-H "Content-Type: application/json" \
-d '{
"query": {
"bool": {
"must": [
{ "match": { "content": "hello" } },
{ "range": { "date": { "gte": "2020-01-01" } } }
]
}
}
}'
|
6.3 GUI 工具
| 工具 | 优势 |
|---|
| Kibana | 官方 / 必备 |
| ElasticHD | 国产 / 轻量 |
| Elasticsearch Head | 老牌 / Chrome 插件 |
| Dejavu | 跨平台 / 现代 |
| Cerebro | 集群管理 |
Kibana 装好后 → Dev Tools:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 索引文档
POST /my_index/_doc
{
"title": "Hello",
"content": "World",
"date": "2024-01-01"
}
# 搜索
GET /my_index/_search
{
"query": {
"match": {
"content": "hello"
}
}
}
|
6.5 实战:日志搜索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 创建索引模板(自动 mapping)
PUT /_index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"level": { "type": "keyword" },
"message": { "type": "text" },
"service": { "type": "keyword" }
}
}
}
}
# 批量导入
POST /logs-2024.01/_bulk
{ "index": {} }
{ "@timestamp": "2024-01-01T10:00:00", "level": "INFO", "message": "started", "service": "api" }
|
6.6 性能调优
1
2
3
4
5
6
7
8
9
10
11
12
| # 索引设置
index.number_of_shards: 3
index.number_of_replicas: 1
index.refresh_interval: 30s # 默认 1s → 30s 减少 IO
# 字段类型优化
"message": {
"type": "text",
"fields": {
"keyword": { "type": "keyword", "ignore_above": 256 }
}
}
|
七、组合实战
7.1 全栈后端开发环境
1
2
3
4
5
| 代码:IntelliJ IDEA + VSCode
本地 DB:MySQL / Redis / SQLite
消息:EMQX + MQTTX
搜索:Elasticsearch + Kibana
工具:Navicat / DBeaver / Redis Desktop
|
7.2 IoT 设备监控
1
2
3
4
5
6
7
| 设备:MQTT Publish(sensor/data)
↓ EMQX Broker
MQTTX 订阅
↓ 规则引擎
InfluxDB 时序存储
↓ Grafana 看板
↓ 告警 → 钉钉
|
7.3 日志分析系统
1
2
3
4
5
| 应用 → Filebeat → Kafka
↓ Logstash
Elasticsearch
↓ Kibana
可视化 / 告警
|
八、常见问题
8.1 MySQL 8.0 caching_sha2_password 鉴权
旧客户端连接失败。解决:
1
| ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '<PASSWORD>';
|
8.2 Redis 公网暴露被攻击
- bind 127.0.0.1:只本地访问
- requirepass:开密码
- rename-command CONFIG “”:禁 CONFIG 命令
- 防火墙规则
8.3 SQLite 锁库问题
SQLite 写操作会全库锁。解决:
- WAL 模式:
PRAGMA journal_mode=WAL;(读写并发) - 超时设置:
PRAGMA busy_timeout=5000; - 多连接 + 短事务
8.4 MQTTX 连接失败
- 端口:
1883(TCP)/ 8883(TLS) - Client ID 冲突:自动生成
- 认证:填 username / password
- TLS 证书:自签名需要勾"允许自签名"
8.5 Elasticsearch 启动报错
- JVM 堆不够:调
-Xms / -Xmx - root 用户:需要
-Ediscovery.type=single-node + 创建 elasticsearch 用户 - max_map_count:
sysctl -w vm.max_map_count=262144
九、下一步
- 想看消息队列:[2023-12-15 消息队列镜像实战:RabbitMQ / EMQX / ActiveMQ]
- 想看监控告警:[2025-03-15 Prometheus 监控告警体系]
- 想看时序数据库:[2023-09-15 时序数据库三剑客]
本文写于 2016 年,回看当时:MySQL 8.0 还未发布(2018-04);Redis 4.0 时代,模块系统才刚上;MQTT 5.0 还在草案(2019 发布);Elasticsearch 5.0 重构了 Type 概念——10 年后 5 款工具仍是同类最强。