gpt4 book ai didi

mysql - 如何使用索引优化 MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 11:30:04 25 4
gpt4 key购买 nike

关于这个database (来自 MySQL 示例的员工)我必须使用索引优化此查询:

SELECT t.title,
Avg(s.salary) salario_medio
FROM titles t,
salaries s
WHERE t.emp_no = s.emp_no
AND t.to_date > Now()
AND s.to_date > Now()
GROUP BY t.title
ORDER BY salario_medio DESC;

我已经在“工资”表上创建了这个索引:

CREATE INDEX to_date_idx ON salaries(to_date);

但是 EXPLAIN 给了我这些行:

    *************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: s
type: range
possible_keys:PRIMARY,emp_no,to_date_idx
key: to_date_idx
key_len: 3
ref: NULL
rows: 370722
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: t
type: ref
possible_keys: PRIMARY,emp_no
key: emp_no
key_len: 4
ref: employees.s.emp_no
rows: 1
Extra: Using where

我不想使用使用临时使用文件排序

信息:

SHOW CREATE TABLE salaries;

CREATE TABLE `salaries`
(
`emp_no` INT(11) NOT NULL,
`salary` INT(11) NOT NULL,
`from_date` DATE NOT NULL,
`to_date` DATE NOT NULL,
PRIMARY KEY (`emp_no`, `from_date`),
KEY `emp_no` (`emp_no`),
KEY `to_date_idx` (`to_date`)
) engine=myisam DEFAULT charset=latin1 show CREATE TABLE titles;

CREATE TABLE `titles`
(
`emp_no` INT(11) NOT NULL,
`title` VARCHAR(50) NOT NULL,
`from_date` DATE NOT NULL,
`to_date` DATE DEFAULT NULL,
PRIMARY KEY (`emp_no`, `title`, `from_date`),
KEY `emp_no` (`emp_no`)
)
engine=myisam
DEFAULT charset=latin1

最佳答案

我建议像这样编写查询:

SELECT t.title,
(SELECT AVG(s.salary)
FROM salaries s
WHERE t.emp_no = s.emp_no AND
s.to_date > NOW()
) as salario_medio
FROM titles t
WHERE t.to_date > NOW()
ORDER BY salario_medio DESC;

此查询可以利用 titles(to_date, title, emp_no)salaries(emp_no, to_date) 上的索引。

这消除了聚合所需的排序。查询仍需要对最终结果进行排序。

关于mysql - 如何使用索引优化 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com