ElasticSearch 索引 VS MySQL 索引
- - crossoverJie's Blog这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的. 这甚至比在我本地使用 MySQL 通过主键的查询速度还快. 这类问题网上很多答案,大概意思呢如下:. Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的索引数据,相对于.
Mysql索引使用的数据结构主要有 BTree索引 和 Hash索引。对于Hash索引来说,底层数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,使用Hash索引查询性能最快。其余大多数场景建议使用BTree索引。
MySQL的基本存储结构为 页 ,页与页之间使用双向链表进行链接,页内记录使用单向链表进行链接。查询数据时,先使用双向链表查询到数据所在的页,页内查询时,where子句中如果是主键则根据二分查找进行查询,如果为非主键则使用遍历链表的方式进行查询。整个时间复杂度为O(n)。
使用索引之后,可以利用BTree的数据结构进行查找数据,时间复杂度可以做到O(log n)。
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
复制代码
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
复制代码
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
复制代码
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
复制代码
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
复制代码
简单来讲,建立联合索引时,当最左边的一个或多个索引确定之后,紧跟着的索引才是有序的。(如下图,建立a,b的联合索引后,a的值为[1,1,2,2,3,3]有序,b的值为[1,2,1,4,1,2])当不确定a的值时,b的值在结构上是无序的,这时仅where子查询中如果只使用b进行查找则会全表查找。 所以当我们用
where a = 1 and b = 2
进行查询时,由于a确定之后b的值有序,所以b字段查询时使用上索引。当我们用where a > 1 and b = 2
进行查询时,a字段可以使用索引,但b字段由于无序所以无法使用索引。
简单概括
- 聚集索引就是以主键创建的索引
- 非聚集索引就是以非主键创建的索引
二者区别
where like '%索引'
无法使用索引Select * fromuser where phone=13800001234
select id,name from product limit 866613, 20
使用上述SQL语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此列中,上一页最大的id是866612。SQL可以采用如下的写法: select id,name from product where id> 866612 limit 20。
Q:请说说索引的注意事项,或者说说索引的优缺点。