【问题标题】:MySQL - how to optimize large set of conditionsMySQL - 如何优化大量条件
【发布时间】:2016-03-28 11:27:39
【问题描述】:

我已经为此头晕目眩,我需要你的帮助。

我的数据库

  • 导入的 CSV 文件:22 列和 11k 行
  • 2 个表格具有相同的数据(均由 CSV 创建)
  • ID 作为 PRIMARY KEY 添加到两者
  • 所有 VARCHAR(60) 某些列是空字符串''

数据库:

PID  | CODE 1 | CODE 2 | CODE 3 | CODE 4 | CODE 5 | CODE X (up to 9) | ID 
-------------------------------------------------------------------------
  1  |   a    |    b   |   c    |        |        |                  |  1
  2  |   a    |        |   b    |    d   |        |                  |  2
  3  |   x    |        |        |        |        |        y         |  3
  • DB 有 22 列,但我只包括 CODE 列(最多 9) 我可能对 SQL 语句感兴趣。
  • 那只是读取表 - MyISAM 引擎?

我想做什么

select PID = 1 from first table
and retrieve all PIDs from second table
IF
  selected PID's column CODE 1 
  or 
  selected PID's column CODE 2 (which is b) etc (up to 9). 
  = any PID's CODE X

所以我应该只得到 PID 2。

编辑: PID 不是 ID,它只是一个示例代码,它可能是字符串:'002451',我正在寻找具有相同 CODES 的其他 PID(例如 PID1code = a 所以它应该找到PID2 因为它的CODE 列之一包含a)

我的尝试

SELECT a.* FROM `TABLE1` a WHERE
(
  SELECT * FROM `TABLE2` b WHERE b.`PID` = 1
  AND
    (
    ( b.`CODE 1` NOT IN ('') AND IN (a.`CODE 1`,a.`CODE 2`, A.`CODE 3`...) ) OR
    ( b.`CODE 2` NOT IN ('') AND (a.`CODE 1`,a.`CODE 2`, A.`CODE 3`...) ) OR...

我最终会得到大型查询 - 超过 81 个条件。就性能而言......好吧,它不起作用。

我凭直觉知道我应该

  • 使用索引(在 CODE 1 / CODE 2 / CODE 3 等?)
  • 使用 JOIN ON(但我太笨了)——这就是我创建 2 个表的原因(假设我不想要 TEMP.TABLES)

如何高效地编写 SQL / 设计 DB?

【问题讨论】:

  • 修复您的数据库以使每个 pidcode 有一行。拥有多个具有相同数据的列几乎不是正确的解决方案。
  • 您能详细说明一下吗?每个pid 一行,每个代码一行?或者将这 22 列减少到只需要的列。

标签: mysql sql join


【解决方案1】:

正确的数据结构是每个pidcode 一行。最简单的方法是:

create table PCodes (
    pid int not null,
    code varchar(255),
    constraint fk_PCodes_pid references p(pid)
);

然后您将值放在一列中,并且检查匹配代码要简单得多。

在实践中,您应该有三个表:

create table Codes (
    CodeId int not null auto_increment primary key,
    Code varchar(255)
);

create table PCodes (
    pid int not null,
    codeid int not null, 
    constraint fk_PCodes_pid references p(pid),
    constraint fk_PCodes_codeid references codes(codeid);
);

如果代码的顺序对每个“p”都很重要,则在PCodes 表中包含priorityordering 列。

【讨论】:

  • 哦,好吧 - 所以我应该把这个表改写成这样:ID -> PID -> CODE(一列有多个值分配给一个ID),是对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多