Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL EXPLAIN: "Using index" vs. "Using index condition"

The MySQL 5.4 documentation, on Optimizing Queries with EXPLAIN, says this about these Extra remarks:

  • Using index

The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row. This strategy can be used when the query uses only columns that are part of a single index.

[...]

  • Using index condition

Tables are read by accessing index tuples and testing them first to determine whether to read full table rows. In this way, index information is used to defer (“push down”) reading full table rows unless it is necessary.

Am I missing something, or do these two mean the same thing (i.e. "didn't read the row, index was enough")?

like image 638
Piskvor left the building Avatar asked Nov 06 '09 13:11

Piskvor left the building


People also ask

What is using index condition?

Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a table using an index. Without ICP, the storage engine traverses the index to locate rows in the base table and returns them to the MySQL server which evaluates the WHERE condition for the rows.

Why index is not used in MySQL?

The Benefits and Drawbacks of Using Indexes in MySQLIndexes consume disk space. Indexes degrade the performance of INSERT, UPDATE and DELETE queries – when data is updated, the index needs to be updated together with it. MySQL does not protect you from using multiple types of indexes at the same time.

What is index in MySQL What is advantage of index?

Indexes are used to find rows with specific column values quickly. Without an index, MySQL must begin with the first row and then read through the entire table to find the relevant rows. The larger the table, the more this costs.

Does MySQL like use index?

MySQL also uses indexes for LIKE comparisons if the argument to LIKE is a constant string that doesn't start with a wildcard character.

What is the difference between using index and using index condition?

it's not clear enough, you can not explain the different bewteen use and not use index condition. The difference is that "Using index" doesn't need a lookup from the index to the table, while "Using index condition" sometimes has to. I'll try to illustrate this with an example. Say you have this table:

When'column extra'says'using index condition'in MySQL?

It explain that when 'Column Extra' says 'Using Index Condition', all columns in where condition are using index. If there are any columns out of index, then Column Extra say Using Where, Using Index (in this case, Mysql need look for in data row to apply where clause).

How to apply where clause using index in MySQL?

If there are any columns out of index, then Column Extra say Using Where, Using Index (in this case, Mysql need look for in data row to apply where clause). It's better 'Using Index Condition'.

How to use the MySQL use index hint?

The following illustrates syntax of the MySQL USE INDEX hint: SELECT select_list FROM table_name USE INDEX (index_list) WHERE condition; In this syntax, the USE INDEX instructs the query optimizer to use one of the named indexes to find rows in the table.


2 Answers

An example explains it best:

SELECT Year, Make --- possibly more fields and/or from extra tables FROM myUsedCarInventory WHERE Make = 'Toyota' AND Year > '2006'  Assuming the Available indexes are:   CarId   VIN   Make   Make and Year 

This query would EXPLAIN with 'Using Index' because it doesn't need, at all, to "hit" the myUsedCarInventory table itself since the "Make and Year" index "cover" its need with regards to the elements of the WHERE clause that pertain to that table.

Now, imagine, we keep the query the same, but for the addition of a condition on the color

... WHERE Make = 'Toyota' AND Year > '2006' AND Color = 'Red' 

This query would likely EXPLAIN with 'Using Index Condition' (the 'likely', here is for the case that Toyota + year would not be estimated to be selective enough, and the optimizer may decide to just scan the table). This would mean that MySQL would FIRST use the index to resolve the Make + Year, and it would have to lookup the corresponding row in the table as well, only for the rows that satisfy the Make + Year conditions. That's what is sometimes referred as "push down optimization".

like image 51
mjv Avatar answered Oct 06 '22 00:10

mjv


The difference is that "Using index" doesn't need a lookup from the index to the table, while "Using index condition" sometimes has to. I'll try to illustrate this with an example. Say you have this table:

id, name, location 

With an index on

name, id 

Then this query doesn't need the table for anything, it can retrieve all it's information "Using index":

select id, name from table where name = 'Piskvor' 

But this query needs a table lookup for all rows where name equals 'Piskvor', because it can't retrieve location from the index:

select id from table where name = 'Piskvor' and location = 'North Pole' 

The query can still use the index to limit the results to the small sets of row with a particular name, but it has to look at those rows in the table to check if the location matches too.

like image 40
Andomar Avatar answered Oct 06 '22 00:10

Andomar