首页 > MYSQL一种常见的应用场景的效率问题

MYSQL一种常见的应用场景的效率问题

比如A表
aid,acontent
1,内容a

B表
bid,bcontent
abc,内容b

C表是A和B的关联表

我现在是这样设计的C表:

abid,ccontent
1@abc,内容c

这样好处是在SELECT的时候可以用substring_index(abid,'@',1)=aid或substring_index(abid,'@',-1)=bid来跟A表或B表做关联。同时可以让abid这个字段非重索引,以后添加修改C表的数据可以直接replace into

但是我发现当数据量比较多的时候效率很一般。请问有没有更好的替代方案


C表为什么不是
aid, bid, ccontent
1, abc, 内容c

关联更简单, C.aid = A.aid;
在(aid, bid)上建了唯一索引 也可以replace into

索引也更加灵活, a, b, (a,b), (b,a)上皆可建索引, 具体看你的需求

更新

联合唯一索引:

mysql> create table a1 (a int, b int, unique key (a,b));
Query OK, 0 rows affected (0.13 sec)

mysql> show create table a1;
+-------+------------------------------------------------------------------------------
-----------------------------------------------------------------+
| Table | Create Table
                                                                 |
+-------+------------------------------------------------------------------------------
-----------------------------------------------------------------+
| a1    | CREATE TABLE `a1` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  UNIQUE KEY `a` (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------
-----------------------------------------------------------------+
1 row in set (0.02 sec)

更新: replace into

mysql> delete from a1;
Query OK, 1 row affected (0.04 sec)

mysql> replace into a1 values(1,1, 1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from a1;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+
1 row in set (0.00 sec)

mysql> replace into a1 values(1,1, 2);
Query OK, 2 rows affected (0.02 sec)

mysql> select * from a1;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 |    2 |
+------+------+------+
1 row in set (0.00 sec)

abid 这个字段就算做了索引,但是一旦在查询的时候在字段上做函数运算,索引是不起任何作用的。

建议题主还是把 abid 字段拆分开吧,按照最常见的多对多关系来建表。

拆分成 aid 和 bid ,可以建立联合索引。

【热门文章】
【热门文章】