现在mysql中有一张表journal_update_logs,数据量比较大,有3000多万条数据,现在查询比较慢,需要建立索引。
第一步,查看该表的索引:
SHOW INDEX FROM journal_update_logs;
每张表都会有原始的主键索引PRIMARY,下面的索引是我后面加的,date_range_index是日期的范围索引,如果需要查询某个时间段内的记录,并且字段是日期类型,建立一个日期范围查询的索引会比较好。对于日期类型的字段,通常建议使用 B-Tree 索引,因为 B-Tree 索引适合范围查询,能够快速定位到指定范围内的记录。
举个例子,假设你有一个表 your_table,其中包含一个日期类型的字段 date_column,你想要查询某个时间段内的记录,可以创建如下索引:
CREATE INDEX date_range_index ON your_table (date_column);
后面两个为复合索引,一条sql中需要查询article_title以及pub_date,可以为他们创建复合索引:
创建方式:
CREATE INDEX idx_article_title_pub_date ON journal_update_logs (article_title, pub_date);
需要注意的是::MySQL 不允许在包含 BLOB、TEXT 或者 VARCHAR 列上创建索引时使用索引长度限制。因此,如果 article_title 列是 BLOB、TEXT 或者 VARCHAR 类型,那么不能直接为该列创建一个复合索引。不然会报错:BLOB/TEXT column ‘article_title’ used in key specification without a key length
解决此问题的一种方法是在创建索引时为 BLOB、TEXT 或者 VARCHAR 类型的列指定一个前缀长度。这样,就可以为这些列创建一个索引。下面是一个示例,演示了如何为 BLOB、TEXT 或者 VARCHAR 类型的列创建一个带有前缀长度的索引:
CREATE INDEX idx_article_title_pub_date ON journal_update_logs (article_title(255), pub_date);
**第二步:**创建索引
现在通过createtime查询:这个字段没有索引:查询花费27秒:
为该字段创建索引:
再次运行,可以看到2.5秒就完成了查询,几乎提升了10倍的速度
以下是索引的一些类型:
1、唯一索引:这将为指定字段创建一个唯一索引,确保该字段中的值在整个表中是唯一的。
CREATE UNIQUE INDEX index_name ON your_table_name (your_column_name);
2、全文索引:这将为指定字段创建一个全文索引,用于支持全文搜索功能。
CREATE FULLTEXT INDEX index_name ON your_table_name (your_column_name);
3、复合索引:这将为多个字段创建一个复合索引,以支持多列查询。
CREATE INDEX index_name ON your_table_name (column1, column2);
4、空间索引:这将为指定的空间数据字段创建一个空间索引,用于支持地理空间数据查询。
CREATE SPATIAL INDEX index_name ON your_table_name (your_column_name);
5、组合索引:这将为多个字段创建一个组合索引,并指定索引类型为 B-树(BTREE)。
CREATE INDEX index_name ON your_table_name (column1, column2) USING BTREE;