6.8.1 使用 MySQL 构建一个队列表

典型的模式是一个表包含多种类型的记录:

  • 未处理记录
  • 已处理记录
  • 正在处理记录

这种系统在高流量, 高并发情况下表现不好.

原因:

  • 随着队列表越来越大和索引深度的增加, 找到未处理记录的速度会随之变慢
  • 一般处理过程分两步, 先找到未处理记录然后加锁
  • 避免多个消费者重复处理同一个记录

例子:

image.png

两个查询之间的 “间隙时间”, 这里的锁会让所有其他同样的查询全部都被阻塞.

不是同别清楚这里 “间隙时间” 是指什么, 猜测是间隙锁.

改进的写法:

  • 无需使用 SELECT 去查询哪些记录还没有被处理

image.png

基础原则:

image.png
image.png

或者使用 Redis 或其他 MQ.

6.8.2 计算两点之间的距离

不建议使用 MySQL 做太复杂的空间信息存储.

例子:

image.png

两点间距离公式 (应该是球面):

image.png

  • 地球半径3959英里, 6371千米
  • 无法使用索引

image.png

优化:

  • 不需要精确计算
  • 根据毕达哥拉斯定理, 将复杂公式变成简单的
    • 进一步使用正方形

image.png

优化索引:

image.png

image.png

完整查询:

image.png

使用最大圆公式或者毕达哥拉斯定理计算:

  • 这里又使用了精确计算, 但是更快

image.png

image.png

6.8.3 使用用户自定义函数

编写 C/C++ 函数.