【发布时间】:2021-02-07 09:23:47
【问题描述】:
考虑到这张表,
CREATE TABLE tbl_tax (
taxdata_id int(11) NOT NULL AUTO_INCREMENT,
tax_year varchar(255) NOT NULL,
display_pid varchar(255) NOT NULL,
type varchar(255) NOT NULL,
tax_id varchar(255) NOT NULL,
tax_amount varchar(255) NOT NULL,
total_due varchar(255) NOT NULL,
paid_wcert varchar(255) NOT NULL,
datelast_adv varchar(255) NOT NULL,
pmtmade_today varchar(255) NOT NULL,
owner_name varchar(255) NOT NULL,
PRIMARY KEY (taxdata_id),
UNIQUE KEY unique_tbl_tax_TaxidYear (tax_id,tax_year),
KEY tax_year_2 (tax_year, owner_name, tax_id, display_pid,
type, tax_amount, total_due, total_paid, datelast_adv, pmtmade_today,
taxdata_id, paid_wcert)
) ENGINE=InnoDB AUTO_INCREMENT=100000 DEFAULT CHARSET=latin1;
tbl_tax;
考虑到这个 SQL 查询,
SELECT tax_year
, tax_id
, owner_name
, display_pid
, type
, tax_amount
, total_due
, total_paid
, datelast_adv
, pmtmade_today
, taxdata_id
, paid_wcert
FROM tbl_tax
WHERE tax_year >= '2015'
AND tax_year <= '2019'
ORDER
BY tax_year DESC;
我想创建一个索引并尝试创建一个封面索引。
引自this文章, “一般规则是先选择列进行过滤(具有相等条件的 WHERE 子句),然后排序/分组(ORDER BY 和 GROUP BY 子句),最后是数据投影(SELECT 子句)。”
ALTER TABLE tbl_tax
ADD INDEX (
`tax_year`, `owner_name`, `tax_id`, `display_pid`,
`type`, `tax_amount`, `total_due`, `total_paid`, `datelast_adv`, `pmtmade_today`,
`taxdata_id`, `paid_wcert`
);
做一个explain,表演,
"id" : 1,
"select_type" : "SIMPLE",
"table" : "tbl_tax",
"partitions" : null,
"type" : "index",
"possible_keys" : "tax_year_2",
"key" : "tax_year_2",
"key_len" : "2831",
"ref" : null,
"rows" : 271630,
"filtered" : 50.00,
"Extra" : "Using where; Backward index scan; Using index"
在创建索引时,我知道:-
- 包含范围谓词(=)的 WHERE 子句
- 查询包含 ORDER_BY 的顺序与访问行的顺序不同。
这可能是explain 的输出显示"rows" : 271630, 的原因
但是,SQL 查询的结果集只有 ~2000 行。
尝试阅读许多文章,但我仍在努力优化。
对于这种情况,我可以做些什么来获得更好的优化? 我可以以更好的方式创建索引吗? 我可以对 SQL 查询进行任何更改吗? 另外,如果我在这里误解了什么,请随时纠正我。
【问题讨论】:
-
我想你可以告诉我们 tax_year_2
-
请同时显示表格定义。
-
用更多信息更新了问题。
标签: mysql sql indexing mariadb query-optimization