Category: Indexes

  • NonClustered Index

    SQL Non-Clustered Indexes

    The SQL Non-Clustered index is similar to the Clustered index. When defined on a column, it creates a special table which contains the copy of indexed columns along with a pointer that refers to the location of the actual data in the table. However, unlike Clustered indexes, a Non-Clustered index cannot physically sort the indexed columns.

    Following are some of the key points of the Non-clustered index in SQL −

    • The non-clustered indexes are a type of index used in databases to speed up the execution time of database queries.
    • These indexes require less storage space than clustered indexes because they do not store the actual data rows.
    • We can create multiple non-clustered indexes on a single table.

    MySQL does not have the concept of Non-Clustered indexes. The PRIMARY KEY (if exists) and the first NOT NULL UNIQUE KEY(if PRIMARY KEY does not exist) are considered clustered indexes in MySQL; all the other indexes are called Secondary Indexes and are implicitly defined.

    To get a better understanding, look at the following figure illustrating the working of non-clustered indexes −

    Non-Clustered

    Assume we have a sample database table with two columns named ID and NAME. If we create a non-clustered index on a column named ID in the above table, it will store a copy of the ID column with a pointer that points to the specific location of the actual data in the table.

    Syntax

    Following is the syntax to create a non-clustered index in SQL Server −

    CREATENONCLUSTEREDINDEX index_name 
    ON table_name (column_name)

    Here,

    • index_name: holds the name of non-clustered index.
    • table_name: holds the name of the table where you want to create the non-clustered index.
    • column_name: holds the name of the column that you want to define the non-clustered index on.

    Example

    Let us create a table named CUSTOMERS using the following query −

    CREATETABLE CUSTOMERS(
       ID INTNOTNULL,
       NAME VARCHAR(20)NOTNULL,
       AGE  INTNOTNULL,
       ADDRESS CHAR(25),
       SALARY DECIMAL(20,2),);

    Let us insert some values into the above-created table using the following query −

    INSERTINTO CUSTOMERS VALUES(7,'Muffy','24','Indore',5500),(1,'Ramesh','32','Ahmedabad',2000),(6,'Komal','22','Hyderabad',9000),(2,'Khilan','25','Delhi',1500),(4,'Chaitali','25','Mumbai',6500),(5,'Hardik','27','Bhopal',8500),(3,'Kaushik','23','Kota',2000);

    The table is successfully created in the SQL database.

    IDNAMEAGEADDRESSSALARY
    7Muffy24Indore5500.00
    1Ramesh32Ahmedabad2000.00
    6Komal22Hyderabad9000.00
    2Khilan25Delhi1500.00
    4Chaitali25Mumbai6500.00
    5Hardik27Bhopal8500.00
    3Kaushik23Kota2500.00

    Now, let us create a non-clustered index on a single column named ID using the following query −

    CREATENONCLUSTEREDINDEX NON_CLU_ID 
    ON customers (ID ASC);

    Output

    On executing the above query, the output is displayed as follows −

    Commands Completed Successfully.
    

    Verification

    Let us retrieve all the indexes that are created on the CUSTOMERS table using the following query −

    EXEC sys.sp_helpindex @objname= N'CUSTOMERS';

    As we observe, we can find the column named ID in the list of indexes.

    index_nameindex_descriptionindex_keys
    1NON_CLU_IDnonclustered located on PRIMARYID

    Now, retrieve the CUSTOMERS table again using the following query to check whether the table is sorted or not −

    SELECT*FROM CUSTOMERS;

    As we observe, the non-clustered index does not sort the rows physically instead, it creates a separate key-value structure from the table data.

    IDNAMEAGEADDRESSSALARY
    7Muffy24Indore5500.00
    1Ramesh32Ahmedabad2000.00
    6Komal22Hyderabad9000.00
    2Khilan25Delhi1500.00
    4Chaitali25Mumbai6500.00
    5Hardik27Bhopal8500.00
    3Kaushik23Kota2500.00

    Creating Non-Clustered Index on Multiple Columns

    Instead of creating a new table, let us consider the previously created CUSTOMERS table. Now, try to create a non-clustered index on multiple columns of the table such as ID, AGE and SALARY using the following query −

    CREATENONCLUSTEREDINDEX NON_CLUSTERED_ID 
    ON CUSTOMERS (ID, AGE, SALARY);

    Output

    The below query will create three separate non-clustered indexes for ID, AGE, and SALARY.

    Commands Completed Successfully.
    

    Verification

    Let us retrieve all the indexes that are created on the CUSTOMERS table using the following query −

    EXEC sys.sp_helpindex @objname= N'CUSTOMERS';

    As we observe, we can find the column names ID, AGE and SALARY columns in the list of indexes.

    index_nameindex_descriptionindex_keys
    1NON_CLU_IDnonclustered located on PRIMARYID, AGE, SALARY
  • Clustered Index

    An index in a database is a data structure that helps to improve the speed of retrieving specific data from tables and views.

    Data in a table is stored in the form of an unordered data structure called a “Heap”, where rows are placed without any specific order. Thus, when retrieving data from a table, the query optimizer must scan the entire table to locate the requested rows. This process can be time-consuming, especially when we are dealing with large tables. To speed up the data retrieval, SQL provides a data object called index that stores and organizes table data in a specific way, allowing faster data access.

    SQL Clustered Indexes

    clustered index in SQL is a type of index that determines the physical order in which the data values will be stored in a table.

    When a clustered index is defined on a specific column, during the creation of a new table, the data is inserted into that column in a sorted order. This helps in faster retrieval of data since it is stored in a specific order.

    • It is recommended to have only one clustered index on a table. If we create multiple clustered indexes on the same table, the table will have to store the same data in multiple orders which is not possible.
    • When we try to create a primary key constraint on a table, a unique clustered index is automatically created on the table. However, the clustered index is not the same as a primary key. A primary key is a constraint that imposes uniqueness on a column or set of columns, while a clustered index determines the physical order of the data in the table.

    MySQL database does not have a separate provisions for Clustered and Non-Clustered indexes. Clustered indexes are automatically created when PRIMARY KEY is defined on a table. And when the PRIMARY KEY is not defined, the first UNIQUE NOT NULL key is treated as a Clustered index.

    Syntax

    Following is the syntax to create a clustered index with SQL Server −

    CREATEINDEX index_name ON table_name(column_name [asc|desc])

    Where,

    • index_name: specifies the name you want to give to the index being created.
    • column_name: specifies the column(s) that will be indexed in the order specified.
    • asc|desc: specifies the order (asc – ascending, desc – descending) in which the data should be sorted. The default sorting order is ascending order.

    Example

    In this example, let us create a clustered index on a table in SQL Server. For that, we need to first create a table named CUSTOMERS using the following query −

    CREATETABLE CUSTOMERS( 
       ID INTNOTNULL, 
       NAME VARCHAR(20)NOTNULL, 
       AGE  INTNOTNULL, 
       ADDRESS CHAR(25), 
       SALARY DECIMAL(20,2));

    Now, insert some values into the CUSTOMERS table using the following query −

    INSERTINTO CUSTOMERS VALUES(7,'Muffy','24','Indore',5500),(1,'Ramesh','32','Ahmedabad',2000),(6,'Komal','22','Hyderabad',9000),(2,'Khilan','25','Delhi',1500),(4,'Chaitali','25','Mumbai',6500),(5,'Hardik','27','Bhopal',8500),(3,'Kaushik','23','Kota',2000);

    The table is successfully created in the SQL Server database.

    IDNAMEAGEADDRESSSALARY
    7Muffy24Indore5500.00
    1Ramesh32Ahmedabad2000.00
    6Komal22Hyderabad9000.00
    2Khilan25Delhi1500.00
    4Chaitali25Mumbai6500.00
    5Hardik27Bhopal8500.00
    3Kaushik23Kota2500.00

    Now, let us create a clustered index on the column named ID using the following query −

    CREATECLUSTEREDINDEX CLU_ID ON CUSTOMERS(ID ASC);

    Output

    On executing the above query, the output is displayed as follows −

    Commands Completed Successfully.
    

    Verification

    To verify if the clustered index is defined on ID column, check whether the records of CUSTOMERS table are sorted by retrieving them using the following query −

    SELECT*FROM CUSTOMERS;

    The records of the table are sorted in ascending order based on values in the column named ID.

    IDNAMEAGEADDRESSSALARY
    1Ramesh32Ahmedabad2000.00
    2Khilan25Delhi1500.00
    3Kaushik23Kota2500.00
    4Chaitali25Mumbai6500.00
    5Hardik27Bhopal8500.00
    6Komal22Hyderabad9000.00
    7Muffy24Indore5500.00

    Creating Clustered Index on Multiple Columns

    With the following example, let us understand how clustered index works when it is created on multiple columns of a table.

    Instead of creating a new table, consider the previously created CUSTOMERS table and define a clustered index on multiple columns of this table, such as AGE and SALARY, using the following query −

    CREATECLUSTEREDINDEX MUL_CLUS_ID 
    ON CUSTOMERS (AGE, SALARY ASC);

    Output

    When we execute the above query, the output is obtained as follows −

    Commands Completed Successfully.
    

    Verification

    Now, let us verify whether the values in the columns AGE and SALARY is sorted or not −

    SELECT*FROM CUSTOMERS;

    As we can observe in the table below, the records are sorted only based on the values in AGE column and not with the values in SALARY column. So, it is recommended to have only one clustered index on a table.

    IDNAMEAGEADDRESSSALARY
    6Komal22Hyderabad9000.00
    3Kaushik23Kota2500.00
    7Muffy24Indore5500.00
    2Khilan25Delhi1500.00
    4Chaitali25Mumbai6500.00
    5Hardik27Bhopal8500.00
    1Ramesh32Ahmedabad2000.00
  •  Unique Indexes

    SQL Unique Indexes

    The SQL Unique Index ensures that no two rows in the indexed columns of a table have the same values (no duplicate values allowed).

    A unique index can be created on one or more columns of a table using the CREATE UNIQUE INDEX statement in SQL.

    Following are the points to be noted before creating a Unique Index on a table −

    • If the unique index is only created on a single column, the rows in that column will be unique.
    • If a single column contains NULL in multiple rows, we cannot create a unique index on that column.
    • If the unique index is created on multiple columns, the combination of rows in these columns will be unique.
    • We cannot create a unique index on multiple columns if the combination of columns contains NULL in more than one row.

    Syntax

    Following is the syntax for creating a UNIQUE INDEX in SQL −

    CREATEUNIQUEINDEX index_name
    ON table_name (column1, column2,..., columnN);

    Here,

    • index_name is the name of the index that you want to create.
    • table_name is the name of the table on which you want to create the index.
    • (column1, column2, …., columnN) are the names of one or more columns on which the unique index is being created.

    Example

    First of all, let us create a table named CUSTOMERS using the following query −

    CREATETABLE CUSTOMERS (
       ID INTNOTNULL,
       NAME VARCHAR(15)NOTNULL,
       AGE INTNOTNULL,
       ADDRESS VARCHAR(25),
       SALARY DECIMAL(10,4),PRIMARYKEY(ID));

    Insert some values into the above-created table using the following query −

    INSERTINTO CUSTOMERS VALUES(1,'Ramesh','32','Ahmedabad',2000),(2,'Khilan','25','Delhi',1500),(3,'kaushik','23','Kota',2000),(4,'Chaitali','26','Mumbai',6500),(5,'Hardik','27','Bhopal',8500),(6,'Komal','22','Hyderabad',9000),(7,'Muffy','24','Indore',5500);

    Once the table is created, let us create a unique index for the column named SALARY in the CUSTOMERS table using the following query −

    CREATEUNIQUEINDEX UNIQUE_ID ON CUSTOMERS (SALARY);

    But, when we execute the above query, the output is obtained as follows −

    ERROR 1062 (23000): Duplicate entry '2000.00' for key 'customers.UNIQUE_ID'
    

    Since a unique index could not be created on SALARY column (due to duplicate values), let us create Unique Index on the NAME column of the same table, using the following query −

    CREATEUNIQUEINDEX UNIQUE_ID ON CUSTOMERS (NAME);

    Output

    When we execute the above query, the output is obtained as follows −

    Query OK, 0 rows affected (0.03 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    Verification

    Let’s verify whether the unique index for the column NAME is created or not using the following query −

    SHOWINDEXFROM CUSTOMERS;

    As you observe the output below, you can find the column NAME along with the ID (PRIMARY KEY) in the list of indexes.

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID
    customers0UNIQUE_ID1NAME

    Updating with Duplicate Values

    If we try to update the columns that have unique index with duplicate values, the database engine generates an error.

    Example

    Assume the previously created CUSTOMERS table and create a unique index on the column named ADDRESS using the following query −

    CREATEUNIQUEINDEX ADD_UNIQUE_INDEX ON CUSTOMERS(ADDRESS);

    Now, let us update the value in the column named ADDRESS with a duplicate (already existing data) value using the following query −

    UPDATE CUSTOMERS SET ADDRESS ='Mumbai'WHERE ADDRESS ='Delhi';

    Output

    On executing the above query, the output is displayed as follows −

    ERROR 1062 (23000): Duplicate entry 'Mumbai' for key 'customers.ADD_UNIQUE_INDEX'
    

    Creating a unique index on Multiple Fields

    We can also create a unique index on multiple fields or columns of a table using the CREATE UNIQUE INDEX statement. To do so, you just need to pass the name of the columns (you need to create the index on) to the query.

    Example

    Instead of creating a new table, let us consider the previously created CUSTOMERS table. We will create a unique index on the columns NAME and AGE using the following query −

    CREATEUNIQUEINDEX MUL_UNIQUE_INDEX ON CUSTOMERS(NAME, AGE);

    Output

    When we execute the above query, the output is obtained as follows −

    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0.
    

    Verification

    Now, let us list all the indexes that are created on the CUSTOMERS table using the following query −

    SHOWINDEXFROM CUSTOMERS;

    As you observe you can find the column names NAME, and AGE along with the ID (PRIMARY KEY) in the list of indexes.

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID
    customers0MUL_UNIQUE_INDEX1NAME
    customers0MUL_UNIQUE_INDEX2AGE
  • Show Indexes

    The SQL Show Index Statement

    The SHOW INDEX is the basic SQL statement to retrieve the information about the indexes that have been defined on a table. However, the SHOW INDEX statement only works on MySQL RDBMS and is not a valid statement in the SQL Server.

    To list the indexes created on a table in SQL Server, a system stored procedure sp_helpindex is used.

    The result-set obtained from querying the SHOW INDEX statement on a MySQL table contains the index information.

    Syntax

    Following is the syntax of the SHOW INDEX statement in MySQL −

    SHOWINDEXFROM table_name;

    Example

    Following example demonstrates the working of SHOW INDEX statement in MySQL. First, create a table with the name CUSTOMERS in the MySQL database using the CREATE query below −

    CREATETABLE CUSTOMERS (
       ID INTNOTNULL,
       NAME VARCHAR(20)NOTNULL,
       AGE INTNOTNULL,
       ADDRESS CHAR(25),
       SALARY DECIMAL(20,2),PRIMARYKEY(ID));

    Let us now insert some values into the above created table using the following query −

    INSERTINTO CUSTOMERS VALUES(1,'Ramesh','32','Ahmedabad',2000),(2,'Khilan','25','Delhi',1500),(3,'Kaushik','23','Kota',2000),(4,'Chaitali','25','Mumbai',6500),(5,'Hardik','27','Bhopal',8500),(6,'Komal','22','Hyderabad',9000),(7,'Muffy','24','Indore',5500);

    Once the data is inserted, create an index for the column NAME in the CUSTOMERS table using the following query −

    CREATEINDEX INDEX_NAME ON CUSTOMERS(NAME);

    Now, you can list all the indexes that are defined on the CUSTOMERS table using the following query −

    SHOWINDEXFROM CUSTOMERS;

    Output

    On executing the above query, the output is displayed as follows −

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID
    customers1index_name1NAME

    Showing Indexes in SQL Server

    In SQL server, the system stored procedure sp_helpindex is used to retrieve the information about the indexes that have been defined on a table. It returns the result as a table that contains detailed information about each index, including the name, type, and columns.

    Syntax

    Following is the basic syntax to list indexes defined on a table in SQL Server −

    sp_helpindex [@objname=]'name'

    Here, [ @objname = ] ‘name’ specifies the name of the table for which the index information is being retrieved. The index information includes −

    • index_name is the names of the columns that are included in index.
    • index_description is the brief description of the index such as the type of index (like clustered or non-clustered).
    • index_keys is the keys that are included in the index.

    Example

    CREATEINDEX INDEX_NAME on CUSTOMERS(NAME);

    Now, let us list all the indexes that are created on the CUSTOMERS table using the system stored procedure sp_helpindex as shown below −

    EXEC sys.sp_helpindex @objname= N'CUSTOMERS';

    Output

    On executing the above query, the output is displayed as follows −

    index_nameindex_descriptionindex_keys
    INDEX_NAMEnonclustered located on PRIMARYNAME
    PK__CUSTOMER__ 3214EC27755869D9clustered, unique, primary key located on PRIMARYID

  • Drop Index

    The DROP statement in SQL is used to remove or delete an existing database object such as a table, index, view, or procedure. Whenever we use DROP statement with any of the database objects, it will remove them permanently along with their associated data.

    And when that database object is an index, the DROP INDEX statement in SQL is used.

    Dropping an SQL Index

    An SQL Index can be dropped from a database table using the DROP INDEX statement.

    It is important to understand that dropping an index can have a significant impact on the performance of your database queries. Therefore, only try to remove an index if you are sure that it is no longer required.

    Note − We cannot delete the indexes created by PRIMARY KEY or UNIQUE constraints. In order to delete them, you need to drop the constraints entirely using ALTER TABLE statement.

    Syntax

    Following is the syntax of the DROP INDEX command in SQL −

    DROPINDEX index_name ON table_name;

    Here,

    • index_name is the name of the index that you want to drop.
    • table_name is the name of the table that the index is associated with.

    Example

    In this example, we will learn how to drop an index on a table named CUSTOMERS, which can be created using the following query −

    CREATETABLE CUSTOMERS(
       ID INTNOTNULL,
       NAME VARCHAR(15)NOTNULL,
       AGE INTNOTNULL,
       ADDRESS VARCHAR(25),
       SALARY DECIMAL(10,4),PRIMARYKEY(ID)););

    Now, insert some values into the above created table using the following query −

    INSERTINTO CUSTOMERS VALUES(1,'Ramesh','32','Ahmedabad',2000),(2,'Khilan','25','Delhi',1500),(3,'Kaushik','23','Kota',2000),(4,'Chaitali','25','Mumbai',6500),(5,'Hardik','27','Bhopal',8500),(6,'Komal','22','Hyderabad',9000),(7,'Muffy','24','Indore',5500);

    Once the table is created, create an index on the column NAME in the CUSTOMERS table using the following query −

    CREATEINDEX INDEX_NAME on CUSTOMERS(NAME);

    Now, verify if the index is created on the CUSTOMERS table using the following SHOW INDEX query −

    SHOWINDEXFROM CUSTOMERS;

    On executing the above query, the index list is displayed as follows −

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID
    customers1index_name1NAME

    Then, drop the same index INDEX_NAME in the CUSTOMERS table using the following DROP INDEX statement −

    DROPINDEX INDEX_NAME ON CUSTOMERS;

    Output

    If we compile and run the above query, the result is produced as follows −

    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    Verification

    Verify if the index for the column NAME is dropped using the following query −

    SHOWINDEXFROM CUSTOMERS;

    In the following list of indexes, you can observe that name of the column Name is missing.

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID

    DROP INDEX with IF EXISTS

    The DROP INDEX IF EXISTS statement in SQL is used to drop an index only if it exists in the table. This statement is specifically useful when you want to drop an index, but you are not sure if the index exists. This clause is not supported by MySQL.

    The IF EXISTS clause ensures that the statement only removes the index if it exists. If the index does not exist, it simply terminates the execution.

    Syntax

    Following is the syntax of the DROP INDEX IF EXISTS in SQL −

    DROPINDEXIFEXISTS index_name
    ON table_name;

    Here,

    • index_name is the name of the index that you want to drop.
    • table_name is the name of the table that the index is associated with.

    Example

    In this example, let us try to drop an index in the SQL Server database.

    Let us consider the previously created table CUSTOMERS and let us create an index for the NAME column in the table using the following query −

    CREATEINDEX INDEX_NAME on CUSTOMERS(NAME);

    Then, let us drop it using the following query −

    DROPINDEXIFEXISTS INDEX_NAME ON CUSTOMERS;

    Output

    When we execute the above query, the output is obtained as follows −

    Commands completed successfully.
    

    Verification

    Let’s verify whether the index for the NAME is dropped or not using the following query −

    EXEC sys.sp_helpindex @objname= N'CUSTOMERS';

    As you observe, the column NAME is deleted from the list of indexes.

    index_nameindex_descriptionindex_keys
    PK__CUSTOMER__3214EC27CB063BB7clustered, unique, primary key locatedPRIMARY on PRIMARYID

    Example

    Now, let us delete an index that doesn’t exist in the CUSTOMERS table using the following query −

    DROPINDEXIFEXISTS INDEX_NAME ON CUSTOMERS;

    Output

    Since no indexes with the specified name exist in the database, so the above query simply terminates the execution without giving any error.

    Commands completed successfully.
    

    Removing indexes created by PRIMARY KEY or UNIQUE

    The DROP INDEX statement does not drop indexes created by PRIMARY KEY or UNIQUE constraints. To drop indexes associated with them, we need to drop these constraints entirely. And it is done using the ALTER TABLE… DROP CONSTRAINT statement.

    Syntax

    Following is the syntax of the ALTER TABLE… DROP CONSTRAINT statement in SQL −

    ALTERTABLE table_name
    DROPCONSTRAINT constraint_name;

    Here,

    • table_name is the name of the table that contains the PRIMARY KEY constraint.
    • constraint_name is the name of the PRIMARY KEY constraint that you want to drop.

    Example

    Assume the previously created table (CUSTOMERS) and let us first list all the indexes that are created on the table using the following query −

    EXEC sys.sp_helpindex @objname= N'CUSTOMERS';

    The list is displayed as follows −

    index_nameindex_descriptionindex_keys
    PK__CUSTOMER__3214EC27CB063BB7nonclustered located on PRIMARYIDID

    Here, the PK__CUSTOMER__3214EC27CB063BB7 is the name of the PRIMARY KEY constraint that was created on the ID column of the CUSTOMERS table.

    Now, let us drop the index created by the PRIMARY KEY constraint.

    ALTERTABLE customers
    DROPCONSTRAINT PK__CUSTOMER__3214EC27CB063BB7;

    Output

    When we execute the above query, the output is obtained as follows −

    Commands completed successfully.
    

    Verification

    Verify whether it is dropped or not by listing the existing indexes using the following query −

    EXEC sys.sp_helpindex @objname= N'CUSTOMERS';

    The following error is displayed because the list of indexes is empty.

    The object 'CUSTOMERS' does not have any indexes, or you do not have permissions.

  • Create Index

    An index is an effective way to quickly retrieve data from an SQL database. It is a database object that references the data stored in a table, which significantly improves query and application performance of a database.

    The process of indexing in SQL is similar to that of an index in a book: it is a database object in the form of a table, contains details of data location, and holds a separate storage space.

    Even though indexes help accelerate search queries, users are not able to directly see these indexes in action.

    What is SQL Index?

    An SQL index is a special lookup table that helps in efficiently searching or querying database tables to retrieve required data. For example, when we try to retrieve data from multiple tables using joins, indexes improve the query performance.

    Indexes are used to optimize the query performance of any Relational Database Management System (RDBMS) as data volumes grow. Hence, they are preferred to be used on frequently queried large database tables.

    Creating an SQL Index

    An index can be created on one or more columns of a table in an SQL database using the CREATE INDEX statement.

    Syntax

    Following is the syntax of CREATE INDEX statement in SQL −

    CREATEINDEX index_name 
    ON table_name (column_name1, column_name2,... column_nameN);

    Here,

    • index_name This specifies the name of the index that you want to create.
    • table_name This specifies the name of the table on which you want to create the index.
    • (column_name1, column_name2…column_nameN) are the names of one or more columns on which the index is being created.

    Example

    To create an index on a database table, we first need to create a table. So, in this example, we are creating a table named CUSTOMERS using the following query −

    CREATETABLE CUSTOMERS(
       ID INTNOTNULL,
       NAME VARCHAR(15)NOTNULL,
       AGE INTNOTNULL,
       ADDRESS VARCHAR(25),
       SALARY DECIMAL(10,4),PRIMARYKEY(ID)););

    Then, insert some values into the CUSTOMERS table using the following query −

    INSERTINTO CUSTOMERS VALUES(1,'Ramesh','32','Ahmedabad',2000),(2,'Khilan','25','Delhi',1500),(3,'Kaushik','23','Kota',2000),(4,'Chaitali','25','Mumbai',6500),(5,'Hardik','27','Bhopal',8500),(6,'Komal','22','Hyderabad',9000),(7,'Muffy','24','Indore',5500);

    Once the table is created, create an index for the column named NAME in the CUSTOMERS table using the following query −

    CREATEINDEX index_name ON CUSTOMERS(NAME);

    Output

    When we execute the above query, the output is obtained as follows −

    Query OK, 0 rows affected (0.06 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    Verification

    The following SHOW INDEX query is used to display all the indexes created on an existing table.

    SHOWINDEXFROM CUSTOMERS;

    In the list obtained, you can find the column name NAME, along with the ID in the list of indexes.

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID
    customers1index_name1NAME

    Creating an Index on Multiple Fields

    We can also create an index on multiple fields (or columns) of a table using the CREATE INDEX statement. To do so, you just need to pass the name of the columns (you need to create the index on).

    Example

    Instead of creating a new table, let us consider the previously created CUSTOMERS table. Here, we are creating an index on the columns NAME and AGE using the following query −

    CREATEINDEX mult_index_data on CUSTOMERS(NAME, AGE);

    Output

    When we execute the above query, the output is obtained as follows −

    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    Verification

    Now, let us list all the indexes that are created on the CUSTOMERS table using the following SHOW INDEX query −

    SHOWINDEXFROM CUSTOMERS;

    As you observe, you can find the column names NAME, and AGE along with ID (PRIMARY KEY), in the list of indexes.

    TableNon_uniqueKey_nameSeq_in_indexColumn_name
    customers0PRIMARY1ID
    customers1index_name1NAME
    customers1mult_index_data1NAME
    customers1mult_index_data2AGE

  • Indexes

    The SQL Indexes

    SQL Indexes are special lookup tables that are used to speed up the process of data retrieval. They hold pointers that refer to the data stored in a database, which makes it easier to locate the required data records in a database table.

    SQL Indexes work similar to the index of a book or a journal.

    While an index speeds up the performance of data retrieval queries (SELECT statement), it slows down the performance of data input queries (UPDATE and INSERT statements). However, these indexes do not have any effect on the data.

    SQL Indexes need their own storage space within the database. Despite that, the users cannot view them physically as they are just performance tools.

    The CREATE INDEX Statement

    An index in SQL can be created using the CREATE INDEX statement. This statement allows you to name the index, to specify the table and which column or columns to index, and to indicate whether the index is in an ascending or descending order.

    Preferably, an index must be created on column(s) of a large table that are frequently queried for data retrieval.

    Syntax

    The basic syntax of a CREATE INDEX is as follows −

    CREATEINDEX index_name ON table_name;

    Types of Indexes

    There are various types of indexes that can be created using the CREATE INDEX statement. They are:

    • Unique Index
    • Single-Column Index
    • Composite Index
    • Implicit Index

    Unique Indexes

    Unique indexes are used not only for performance, but also for data integrity. A unique index does not allow any duplicate values to be inserted into the table. It is automatically created by PRIMARY and UNIQUE constraints when they are applied on a database table, in order to prevent the user from inserting duplicate values into the indexed table column(s). The basic syntax is as follows.

    CREATEUNIQUEINDEX index_name
    on table_name (column_name);

    Single-Column Indexes

    A single-column index is created only on one table column. The syntax is as follows.

    CREATEINDEX index_name
    ON table_name (column_name);

    Composite Indexes

    A composite index is an index that can be created on two or more columns of a table. Its basic syntax is as follows.

    CREATEINDEX index_name
    on table_name (column1, column2);

    Implicit Indexes

    Implicit indexes are indexes that are automatically created by the database server when an object is created. For example, indexes are automatically created when primary key and unique constraints are created on a table in MySQL database.

    The DROP INDEX Statement

    An index can be dropped using SQL DROP command. Dropping an index can effect the query performance in a database. Thus, an index needs to be dropped only when it is absolutely necessary.

    The basic syntax is as follows −

    DROPINDEX index_name;

    When should indexes be avoided?

    Although indexes are intended to enhance a database’s performance, there are times when they should be avoided.

    The following guidelines indicate when the use of an index should be reconsidered.

    • Indexes should not be used on small tables.
    • They should not be used on tables that have frequent, large batch updates or insert operations.
    • Indexes should not be used on columns that contain a high number of NULL values.
    • Columns that are frequently manipulated should not be indexed.