我有这样的查询:
SELECT *
FROM view_name
WHERE column1 = something AND column2 = somethingelse
底层表在column1和column2上都有索引,但是MySQL使用了错误的索引。如何强制它使用正确的索引。像这样:
SELECT *
FROM view_name USE INDEX (table_name.column2)
WHERE column1 = something AND column2 = somethingelse
编辑:有人要求:
SHOW CREATE VIEW view1
CREATE ALGORITHM=UNDEFINED DEFINER=`x`@`localhost` SQL SECURITY DEFINER VIEW `view1` AS select `table1`.`id` AS `identifier`,`table1`.`col1` AS `column1`,`table1`.`col2` AS `column2` from `table1`
SHOW CREATE TABLE table1
CREATE TABLE `table1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col1` varchar(100) NOT NULL,
`col2` varchar(100) NOT NULL,
`col3` varchar(100) NOT NULL,
`col4` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `col1` (`col1`),
KEY `col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
编辑:更详细的解释:
如果我这样做:
SELECT * FROM table1 WHERE col1 = x AND col2 = y
MySQL在col1上选择索引,但性能很差。
如果我这样做:
SELECT * FROM table1 USE INDEX (col2) WHERE col1 = x AND col2 = y
MySQL使用col2上的索引,我获得了很好的表现。
我如何做同样的事情,但在视图上?像这样:
SELECT * FROM view1 USE INDEX (column2) WHERE column1 = x AND column2 = y
如何告诉MySQL在视图上运行查询时要使用哪个索引?
编辑:我刚发现:
视图没有索引,因此索引提示不适用。不允许在从视图中选择时使用索引提示。
https://dev.mysql.com/doc/refman/5.7/en/view-restrictions.html
所以,也许我想要的是不可能的。
答案 0 :(得分:0)
基础表在column1和column2上都有索引......
你是什么意思?为了使此查询更快,您不需要在每列上只有两个SEPARATE索引,而是一个组合索引。尝试添加followinfg索引:
create index ix1 on table_name (column1, column2);
如果没有这个,MySQL可以尝试使用任何不太理想的索引。