6.8.1 使用 MySQL 构建一个队列表
典型的模式是一个表包含多种类型的记录:
- 未处理记录
- 已处理记录
- 正在处理记录
这种系统在高流量, 高并发情况下表现不好.
原因:
- 随着队列表越来越大和索引深度的增加, 找到未处理记录的速度会随之变慢
- 一般处理过程分两步, 先找到未处理记录然后加锁
- 避免多个消费者重复处理同一个记录
例子:
两个查询之间的 “间隙时间”, 这里的锁会让所有其他同样的查询全部都被阻塞.
不是同别清楚这里 “间隙时间” 是指什么, 猜测是间隙锁.
改进的写法:
- 无需使用 SELECT 去查询哪些记录还没有被处理
基础原则:
或者使用 Redis 或其他 MQ.
6.8.2 计算两点之间的距离
不建议使用 MySQL 做太复杂的空间信息存储.
例子:
两点间距离公式 (应该是球面):
- 结果是弧度
- 单位弧度定义为圆弧长度等于半径时的圆心角
- 地球半径3959英里, 6371千米
- 无法使用索引
优化:
- 不需要精确计算
- 根据毕达哥拉斯定理, 将复杂公式变成简单的
- 进一步使用正方形
优化索引:
完整查询:
使用最大圆公式或者毕达哥拉斯定理计算:
- 这里又使用了精确计算, 但是更快
6.8.3 使用用户自定义函数
编写 C/C++ 函数.