MySQL教程建立索引的几个准则 怎样建索引更有效!

数据库索引优化技巧
本文介绍了合理建立数据库索引的方法,包括何时使用索引、如何优化常见查询语句及使用EXPLAIN评估性能等内容。
关于建立索引的几个准则:



1、合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。



2、索引越多,更新数据的速度越慢。



3、尽量在采用MyIsam作为引擎的时候使用索引(因为MySQL以BTree存储索引),而不是InnoDB。但MyISAM不支持Transcation。



4、当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。



5、习惯和强迫自己用EXPLAIN来分析你SQL语句的性能。



一个很容易犯的错误:



不要在选择的栏位上放置索引,这是无意义的。应该在条件选择的语句上合理的放置索引,比如where,order by。



例子:



SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;



上面这个语句,你在id/title/content上放置索引是毫无意义的,对这个语句没有任何优化作用。但是如果你在外键cat_id上放置一个索引,那作用就相当大了。



几个常用ORDER BY语句的MySQL优化:



1、ORDER BY + LIMIT组合的索引优化。如果一个SQL语句形如:



SELECT [column1],[column2],.... FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];





这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。



2、WHERE + ORDER BY + LIMIT组合的索引优化,形如:



SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT];





这个语句,如果你仍然采用第一个例子中建立索引的方法,虽然可以用到索引,但是效率不高。更高效的方法是建立一个联合索引(columnX,sort)



3、WHERE + IN + ORDER BY + LIMIT组合的索引优化,形如:



SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] IN ([value1],[value2],...) ORDER BY[sort] LIMIT [offset],[LIMIT];





这个语句如果你采用第二个例子中建立索引的方法,会得不到预期的效果(仅在[sort]上是using index,WHERE那里是using where;using filesort),理由是这里对应columnX的值对应多个。



这个语句怎么优化呢?我暂时没有想到什么好的办法,看到网上有便宜提供的办法,那就是将这个语句用UNION分拆,然后建立第二个例子中的索引:



SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value1] ORDER BY [sort] LIMIT[offset],[LIMIT]

UNION

SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value2] ORDER BY [sort] LIMIT[offset],[LIMIT]

UNION

……





但经验证,这个方法根本行不通,效率反而更低,测试时对于大部分应用强制指定使用排序索引效果更好点



4、不要再WHERE和ORDER BY的栏位上应用表达式(函数),比如:



SELECT * FROM [table] ORDER BY YEAR(date) LIMIT 0,30;





5、WHERE+ORDER BY多个栏位+LIMIT,比如



SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;





对于这个语句,大家可能是加一个这样的索引(x,y,uid)。但实际上更好的效果是(uid,x,y)。这是由MySQL处理排序的机制造成的。



以上例子你在实际项目中应用的时候,不要忘记在添加索引后,用EXPLAIN看看效果。





另外注意:

索引的字段类型要一致
### MySQL 紾引概述 MySQL 索引是一种用于加速数据库查询的技术,其基本目的是通过提供一种高效的访问路径来减少检索数据所需的时间。索引类似于书籍的目录,能够帮助数据库管理系统快速定位所需的记录而不需要扫描整个表的内容。 #### 1. **索引作用** 索引的主要作用在于提高查询效率。当执行 `SELECT` 查询时,如果没有索引MySQL 将不得不进行全表扫描(Full Table Scan),这意味着它需要逐一检查每一行数据以寻找符合条件的结果。这种操作在大规模数据集中非常耗时。然而,有了索引之后,可以通过快的方式找到目标数据[^1]。 #### 2. **索引的工作原理** MySQL索引基于多种数据结构实现,其中最常见的是 B+ 树。B+ 树的特点是可以有效地支持范围查询和排序操作,同时保持较高的插入与删除性能。此外,还有其他类型的索引,例如哈希索引、全文索引等,每种都有各自的适用场景: - **B+ 树索引**:这是最常见的索引形式,广泛应用于主键索引和其他普通索引中。它的优势在于不仅支持等值查询,还支持范围查询和排序操作。 - **哈希索引**:适用于精确匹配查询,具有极高的查询速度,但在范围查询和支持排序方面表现较差[^4]。 - **全文索引**:主要用于文本搜索,允许用户查找文档中的关键词而非仅仅对比固定值。此功能通常搭配 `MATCH ... AGAINST` 使用,而不适合普通的 `WHERE` 条件过滤[^3]。 #### 3. **索引的设计原则** 并不是所有的列都适合作为索引对象。选择合适的字段建立索引至关重要,因为它直接影响到系统的整体性能。一般来说,应该优先考虑那些频繁出现在 WHERE 子句或者 JOIN 操作中的列作为候选者。另外需要注意的是,并非越多越好——过多的索引可能会增加写入成本并占用多存储空间。 #### 4. **实际使用议** 为了充分发挥索引的优势,在日常开发过程中应当遵循以下几个准则: - 避免不必要的宽泛条件;尽量缩小筛选范围以便好地利用现有索引; - 对经常新但很少被查询的列谨慎添加索引; - 定期分析慢日志找出潜在瓶颈所在之处进而调整相应配置或重缺失索引。 ```sql -- 创普通索引的例子 CREATE INDEX idx_example ON table_name(column_name); -- 删除已存在的索引 DROP INDEX index_name ON table_name; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值