MySQL索引的分类、何时使用、何时不使用、何时失效?

上周在一次技术分享会上听专家讲了MySQL索引的使用和优化。
他说,索引就像图书馆中的书签,可以让你快速找到所需的信息,但如果使用不当,它们会减慢速度。

2 02 3 年,我朋友的公司遇到了数据库查询慢的问题。
原来是索引没有设置好。
他说,首先你要知道索引有几种类型,比如普通索引、唯一索引、主键索引等,每种都有其特定的用途。

他在表上创建索引的时候,会特别注意字段的选择。
例如,默认对主键和唯一字段建立索引,这可以加快数据检索速度。
但表连接字段和条件查询字段也需要索引来优化查询。

有一次,我的朋友在处理模糊查询时,原本想使用索引。
但是,由于通配符位置错误,索引失败。
他表示,这个时候需要注意的是,通配符应该放在查询条件的末尾,比如‘China%’,而不是‘%China’。

他提到,有时候数据量很小,或者字段值重复性很高,所以不需要索引。
因为索引会降低插入、删除、修改的速度。

还记得他讲过一个例子,有一个组合索引(A,B),但是查询时只使用了B,所以不能使用索引。
这意味着不遵循最左前缀原则。

最后他说可以使用EXPLAIN语句来查看查询是否使用了索引。
例如,type字段可以告诉我们是全表扫描还是索引扫描,而key字段则显示实际使用的索引。

你可以弄清楚。
如果您遇到类似的数据库优化问题,这些知识可能会有用。
但具体问题仍需具体分析。
算了,今天就先说到这里了。

MySQL索引,查询中like '%abc%' 能用索引吗?

说实话,当我开始做MySQL索引的时候,我也为LIKE '%abc%'挣扎了很长一段时间。
我记得有一次,当我为客户端进行优化时,查询运行得非常慢,并且 EXPLAIN 显示了 ALL。
我当时就心碎了——这不是典型的模糊前缀问题吗?
有趣的是,这个场景具体反映了指数的“温度”。
你说得对,以%开头的查询确实让MySQL很头疼。
比如有一张表order,order_id字段是有索引的。
如果你使用 WHERE order_id LIKE '%1 004 %',MySQL 会感到困惑 - 1 004 可以在前三个字符,也可以在中间。
谁能帮忙找到他?因此,执行计划直接改为全表扫描(类型:ALL),与爬取一样高效。

但是后来我遇到了一个让我困惑的特殊案例。
有一次在调优电商系统时,有一个查询WHERE产品名称AS'%Bluetooth%'。
按理说需要扫描全表,EXPLAIN的结果显示类型是INDEX,有Use索引。
我跑去查看日志,发现这个表在商品名称和其他一些字段(如商品名称、类别、价格)上建立了复合索引。
我当时就很困惑——这不是你所说的“覆盖索引”吗?虽然模糊查询仍然是从前到后匹配,但由于只搜索索引中的字段,所以不需要返回表。

我后来专门为此检查了文档。
MySQL官网上有一个非常明确的案例:如果使用INDEX(a, b)创建索引,然后检查WHERE a = 'value' AND b LIKE '%content%',MySQL就可以使用该索引。
就像开一家超市一样。
尽管货架标签上写着“所有蓝色产品都在这里”,但如果您直接指向特定的蓝色标签并说“就是这个”,店员必须找到该区域并再次扫描。

在开发规范方面,我更喜欢教给客户一种简单粗暴但有效的方法。
例如,在新闻系统上工作的人必须使用 WHERE LIKE '%policy%' 来检查标题。
我教他们将其更改为 WHERE header LIKE '%policy%' OR header LIKE '%policy%'%'。
虽然听起来比较傻,但至少它让MySQL找到了起始位置。
当然,最好的是,正如你所说,如果你不需要模糊的查询——例如使用分词索引或者将用户输入拆分成关键字来搜索。

就数据而言,我记得有一个测试。
1 00万条数据,全表扫描耗时约0.5 秒,索引扫描仅需0.01 秒。
不过,这个测试是在特定场景下进行的。
不同的表结构和不同的设备,数字会有很大差异。
例如,我上次在阿里云RDS上运行时,索引扫描比全表扫描慢。
这是因为表太大,并且数据页在内存和 SSD 之间来回传递。
结果,I/O 消耗超过了 CPU。

一般来说,当涉及到索引时,不仅仅是记住一些规则。
你必须知道MySQL底层是如何工作的——它不是人,你不会想,“哦,这个%肯定不能被索引。
”它只会计算哪个解决方案它可以根据您提供的规则保存多行数据和多次磁盘旋转。

MySQL如何使用全文检索函数提升搜索效率 MySQL全文索引与MATCH函数的应用

MySQL全文搜索实施指南:
1 .创建全文索引:
语句:CREATE TABLE ENTRIES (ID INT AUTO_INCRMENT PRIMARY KEY, VARCHAR(2 5 5 ) title, content TEXT, FULLTEXT(title, content));
注意:InnoDB引擎支持事务并且具有更好的性能。

2 比赛...针对情况:
自然语言模式:MATCH(title, content) AGAINST('MySQL Optimization' IN NATURAL LANGUAGE MODE);
布尔模式: MATCH(content) AGAINST('+Python -Django' IN BOOLEAN MODE);
查询扩展方式:MATCH(title) AGAINST('AI' With QUERY EXPANSION);
3 .主要参数:
字长限制:ft_min_word_len = 1 (中文字)
停用词:ft_stopword_file='/path/to/stopwords.txt'
4 .性能对比:
全文搜索与 LIKE:即使有数百万数据,全文搜索仍然更快,例如全表扫描。

5 应用建议:
全文检索适用于数据量较大的场景。

中文需要 ngram 解析器或 Elasticsearch。

定期重建索引:ALTER TABLE Articles ADD FULLTEXT(title, content);
实用提醒:创建索引后检查执行计划,确保使用FULLTEXT。

mysql中in使用索引吗

MySQL 中的 IN 运算符使用索引。
考虑以下几点: 1 . 最左边的前缀很有用。
2 .正确的类型,不要搞乱。
3 、如果数据量很大,优化器会选择扫描全表。
4 .通用索引,不要搞错顺序。
总之,使用IN时一定要注意方法。