本文主要内容是如何使用全局索引与CO_HASH分区算法(CO_HASH),实现高效的多维度查询。
1. 淘宝订单号中的秘密
有一个很有趣的事情。
打开你的淘宝客户端或者PC端的淘宝,点开订单列表,打开几个订单,查看他们的订单号,你会发现什么?
比如这是我最近的3个订单,和10年前的3个订单。其订单号分别是:
1249511065364414810
1238822988656414810
1236446127134414810
103698817404810
107655289504810
103719620094810
也许你会惊奇的发现,订单号的后几位好像是一样的。比如我的账号,从10年前到今天,订单号的后四位一直是4810,那么为什么?这个其实和使用分布式数据库的一个最佳实践相关。
2. 经典的买卖家例子
好多年前就流传着淘宝买卖家的案例...
淘宝中有一个非常重要的表,订单表,他里面存着订单的一些关键信息,例如订单号(order_id)、卖家id(seller_id)、买家id(buyer_id)、商品id等等。有两类查询是这个表上的高频查询:
select * from orders where buyer_id = ?
select * from orders where seller_id = ?
这两个SQL的业务含义一目了然,分别是买家查询自己的订单列表和卖家查询自己的订单列表。
如果我们在单机数据库中做这两条SQL,都知道怎么做。嗯,在buyer_id和seller_id上分别建个建索引就可以了:
create index idx_buyer_id on orders (buyer_id);
create index idx_seller_id on orders (seller_id);
在数据库中,空间换时间是一个非常基本的思路,例如加索引。
如果你是用一些分库分表中间件,例如MyCAT之类的产品,对这个表做了分库分表,就需要面临一个跟单机数据库完全不一样的一个问题,该如何选择分库分表键?
一般此类中间件都会告诉你,你哪个列查的最多,就选哪个列做拆分键。