MySQL: low cardinality/selectivity columns = how to index?

前端 未结 7 1270
既然无缘
既然无缘 2020-12-04 15:31

I need to add indexes to my table (columns) and stumbled across this post:

How many database indexes is too many?

Quote: “Having said that, you can clearly

7条回答
  •  粉色の甜心
    2020-12-04 16:15

    The index that you describe is pretty much pointless. An index is best used when you need to select a small number of rows in comparison to the total rows.

    The reason for this is related to how a database accesses a table. Tables can be assessed either by a full table scan, where each block is read and processed in turn. Or by a rowid or key lookup, where the database has a key/rowid and reads the exact row it requires.

    In the case where you use a where clause based on the primary key or another unique index, eg. where id = 1, the database can use the index to get an exact reference to where the row's data is stored. This is clearly more efficient than doing a full table scan and processing every block.

    Now back to your example, you have a where clause of where status = 'enabled', the index will return 150m rows and the database will have to read each row in turn using separate small reads. Whereas accessing the table with a full table scan allows the database to make use of more efficient larger reads.

    There is a point at which it is better to just do a full table scan rather than use the index. With mysql you can use FORCE INDEX (idx_name) as part of your query to allow comparisons between each table access method.

    Reference: http://dev.mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html

提交回复
热议问题