MySQL - 如何优化大量条件

标签 mysql sql join

我已经开始头晕目眩了,我需要你的帮助。

我的数据库

  • 导入的 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
  • 数据库有 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' 我正在寻找具有相同代码的其他 PID(例如 PID1 code = 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 一行。最简单的方法是:

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 列。

关于MySQL - 如何优化大量条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261394/

相关文章:

mysql - 删除mysql中count(*)=1的所有结果

mysql - 如何在不存在的情况下对大型数据库执行查询

entity-framework - Entity Framework 中具有连接数据的存储过程

sql - 如何从 MS SQL 数据库(Microsoft SQL Server)中的其他 .sql 文件运行 .sql 文件?

php - 使用 php 正确编写的 PostgreSQL 准备/执行语句?

mysql - If then join else 其他加入

MySQL - Group By, Max, Inner Join - 问题

mysql_upgrade 和 MySQL 服务 - 恶性循环

MYSQL 帮助不让我创建表

java - 如何处理忘记密码