如何在select语句中使用索引?
比方说,在employee表中,我在表的emp_name
列上创build了一个索引(idx_name)。
我是否需要在select子句中明确指定索引名称,否则会自动用于加快查询速度。
如果需要在select子句中指定,那么在select查询中使用索引的语法是什么?
如果要testing索引以查看它是否有效,请使用以下语法:
SELECT * FROM Table WITH(INDEX(Index_Name))
WITH语句将强制索引被使用。
好问题,
通常,数据库引擎应该根据它构build的查询执行计划自动select要使用的索引。 但是,当您要强制数据库使用特定索引时,有一些非常罕见的情况。
为了能够回答你的具体问题,你必须指定你正在使用的数据库。
对于MySQL,您需要阅读有关如何执行此操作的索引提示语法文档
如何在select语句中使用索引?
这条路:
SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3;
SELECT * FROM table1 IGNORE INDEX (col3_index) WHERE col1=1 AND col2=2 AND col3=3;
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);
还有更多的方法检查这个
我是否需要明确指定?
- 不,不需要明确指定。
- 数据库引擎应根据自@Tudor Constantin答案构build的查询执行计划自动select要使用的索引。
- 优化器将判断使用索引是否会使查询运行得更快,如果是,则会使用索引。 从@niktrl回答
一般来说 ,如果使用索引的假设成本,然后可能不得不执行进一步的书签查找的索引将被用于低于仅扫描整个表的成本。
如果你的查询是这样的forms:
SELECT Name from Table where Name = 'Boris'
1000中有1排名叫鲍里斯,这几乎肯定会被使用。 如果每个人的名字都是Boris,那么它可能会采用表扫描,因为索引不太可能是访问数据的更有效的策略。
如果它是一个宽表(很多列),你可以这样做:
SELECT * from Table where Name = 'Boris'
那么它可能仍然会select执行表扫描,如果这是一个合理的假设,它将需要更多的时间从表中检索其他列比只是查找名称,或者如果它可能正在检索无论如何,很多行。
优化器将判断使用索引是否会使查询运行得更快,如果是,则会使用索引。
根据您的RDBMS,您可以强制使用索引,但除非您知道自己在做什么,否则不build议使用索引。
一般来说,你应该索引你在表连接和where语句中使用的列
通常,当您在表上创build索引时,数据库将在该表中search数据时自动使用该索引。 你不需要做任何事情。
但是,在MSSQL中,您可以指定一个index hint
,它可以指定应使用特定的索引来执行此查询。 关于这方面的更多信息可以在这里find。
Index hint
也似乎可用于MySQL 。 感谢都铎君士坦丁。
通过使用索引在您的条件中应用的列,它将被自动包含。 您不必使用它,但是它会在使用时加速查询。
SELECT * FROM TABLE WHERE attribute = 'value'
将使用适当的索引。