The Table Indexes are always the main focus to improve the performance of any SQL Query.
In MySQL, We can provide INDEX Hint to Query Optimizer for choosing our analyzed Index.
In most of the cases, Query Planner and Query Optimizer are accurate to choose perfect Index.
But sometimes, still It is required to give Index Hint for reducing the overall Query Planning Time.
If we know that this Index is good for this query, we should Provide the Hint to Query Optimizer.
MySQL supports command like USE INDEX, IGNORE INDEX, FORCE INDEX, which we can use for Index Hint.
The USE INDEX hint tells MySQL to use only one of the named indexes to find rows in the table.
The IGNORE INDEX tells MySQL to not use some particular index or indexes.
The FORCE INDEX hint acts like USE INDEX , with the addition that a table scan is assumed to be very expensive.
Prepared small demonstration on this.
Create a sample table:
1 2 3 4 5 6 7 | CREATE TABLE tbl_EmployeeDetails ( EmpID INTEGER PRIMARY KEY ,EmpName VARCHAR(50) ,EmpSalary BIGINT ,DepartmentName VARCHAR(50) ); |
Insert few sample Records:
1 2 3 4 5 6 7 8 9 10 | INSERT INTO tbl_EmployeeDetails VALUES (1,'Anvesh',80000,'Sales') ,(2,'Neevan',90000,'Sales') ,(3,'Jenny',50000,'Production') ,(4,'Roy',60000,'Production') ,(5,'Martin',30000,'Research') ,(6,'Mahi',85000,'Research') ,(7,'Kruti',45000,'Research') ,(8,'Manish',75000,'Research'); |
Create few sample Indexes:
1 2 3 | CREATE INDEX idx_tbl_EmployeeDetails_EmpName ON tbl_EmployeeDetails (EmpName); CREATE INDEX idx_tbl_EmployeeDetails_DepartmentName ON tbl_EmployeeDetails (DepartmentName); CREATE INDEX idx_tbl_EmployeeDetails_EmpName_EmpSalary ON tbl_EmployeeDetails (EmpName,EmpSalary); |
Using USE INDEX:
1 2 3 4 5 6 7 | SELECT *FROM tbl_EmployeeDetails USE INDEX (idx_tbl_EmployeeDetails_EmpName) WHERE EmpName = 'Roy'; SELECT *FROM tbl_EmployeeDetails USE INDEX (idx_tbl_EmployeeDetails_EmpName_EmpSalary) WHERE EmpName = 'Roy' AND EmpSalary > 50000; |
Using IGNORE INDEX:
1 2 3 | SELECT *FROM tbl_EmployeeDetails IGNORE INDEX (idx_tbl_EmployeeDetails_EmpName) WHERE EmpName = 'Roy' AND EmpSalary > 50000; |
Using FORCE INDEX:
1 2 3 | SELECT *FROM tbl_EmployeeDetails FORCE INDEX (idx_tbl_EmployeeDetails_EmpName) WHERE EmpName = 'Roy' AND EmpSalary > 50000; |