在VIEWS中使用指数

时间:2018-06-11 17:30:49

标签: mysql sql

我有这样的查询:

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

所以,也许我想要的是不可能的。

1 个答案:

答案 0 :(得分:0)

  

基础表在column1和column2上都有索引......

你是什么意思?为了使此查询更快,您不需要在每列上只有两个SEPARATE索引,而是一个组合索引。尝试添加followinfg索引:

create index ix1 on table_name (column1, column2);

如果没有这个,MySQL可以尝试使用任何不太理想的索引。