从大量输入

时间:2017-02-21 17:32:46

标签: mysql query-optimization

帮助我需要快速查询。

这是我的情况:

我有2张桌子,员工和期间。

假设表雇员包含emp_no,emp_name 表格句点包含period_code,emp_no。

看起来很好,直到用户输入30k数据并全部搜索。

我的第一个想法是这样的

SELECT p.* from periods p
INNER JOIN employees e ON p.emp_no = e.emp_no
WHERE p.period_code = 'p01' and (e.emp_no IN (first 5k emp_no) or e.emp_no IN (another 5k emp_no), etc).

但是从那个查询中它不会返回那个不在那个时期的员工。 假设只有10k员工在那个时期,另外10k是真实数据但是那些员工不在p01而另一个10k是非存在数据但用户输入并搜索它。

我有另一个想法但不太确定。 我创建临时表,它将插入用户搜索的所有emp_no。 然后我加入他们,这样就可以告诉哪个员工在期间和员工中存在,哪个员工不在那个时期,哪个员工没有效。

某些人喜欢

SELECT t.emp_no,ee.emp_name,p.pcode from employee e
JOIN period p ON p.emp_no = e.emp_no
RIGHT JOIN temp_t t ON t.emp_no = p.emp_no
LEFT JOIN employee ee ON ee.emp_no = t.emp_no

result

结果是好的,因为在pcode字段中只有emp01不为空

你们有没有更好的方法而不将数据插入临时表?

ps:我不知道为什么sqlfiddle不起作用,这里有一些用于测试

CREATE TABLE employee
    (`emp_no` VARCHAR(7), `emp_name` varchar(7))
;
CREATE TABLE period
    (`pcode` VARCHAR(7), `emp_name` varchar(7))
;
CREATE TABLE temp_t
    (`emp_no` VARCHAR(7))
;

INSERT INTO employee
    (`emp_no`, `emp_name`)
VALUES
    ('emp01', 'name1'),
    ('emp02', 'name2')
;

INSERT INTO period
    (`pcode`, `emp_no`)
VALUES
    ('p01', 'emp01')
;

INSERT INTO temp_t
    (`emp_no`)
VALUES
    ('emp01'),
    ('emp02'),
    ('emp03')
;

1 个答案:

答案 0 :(得分:0)

首先,每张桌子应该有PRIMARY KEY可能 employee应该有PRIMARY KEY(emp_no)period应该有PRIMARY KEY(pcode)

之后,请用语言描述您想要实现的目标。