关于建立索引的几个准则

关于建立索引的几个准则:

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看看效果。

### Musql 索引创建与使用教程 Musql 的索引机制类似于 MySQL,在数据库管理中起着至关重要的作用。以下是关于 Musql 索引的相关信息: #### 一、索引的基础概念 索引是一种数据结构,用于提高数据库查询的速度。通过在表上定义索引,可以显著减少检索所需的时间成本。然而,需要注意的是,虽然读取性能得到提升,但写入操作(如 INSERT 和 UPDATE)可能会受到影响,因为每次更新都需要维护索引树。 - **唯一索引**:确保某列或多列上的所有值都必须是唯一的[^3]。 - **主键索引**:除了具有唯一性外,还不能接受 NULL 值。 - **复合索引**:允许在一个表的多列上创建单一索引,从而优化涉及这些字段的复杂查询[^4]。 #### 二、如何创建索引 可以通过 SQL 语句 `ALTER TABLE` 来新增索引。下面是一些常见的例子: 1. 单列索引: ```sql ALTER TABLE user ADD INDEX idx_user_username (username); ``` 2. 复合索引: ```sql ALTER TABLE article ADD INDEX index_title_time (title(50), time(10)); ``` 这里 `(50)` 表示仅对 `title` 列前 50 字符建立索引,适用于大文本类型的字段以节省空间和时间开销[^4]。 3. HASH 类型索引: 如果希望利用哈希算法实现快速查找,则需显式声明索引类型为 `HASH`[^5]: ```sql CREATE TABLE test ( id INT NOT NULL, name VARCHAR(64), UNIQUE KEY USING HASH (id) ); ``` #### 三、删除已存在的索引 由于 Musql 不支持直接修改现有索引属性,因此如果需要调整某个索引设置的话,通常做法是先将其移除然后再重新构建新的版本[^1]: ```sql DROP INDEX idx_user_username ON user; ``` 随后按照需求再次执行相应的添加命令即可完成更改过程。 #### 四、最佳实践建议 当规划索引策略时应遵循以下几个准则: 1. 只针对那些频繁出现在 WHERE 子句或者 JOIN 操作里的列设立辅助性的访问路径; 2. 对于 ORDER BY 或 GROUP BY 中使用的项目也值得考虑加入到候选名单之中; 3. 控制好数量规模——过多冗余的设计反而会对整体表现造成负面影响;一般来说每张表格内部维持大约五六个左右就足够满足大多数场景下的要求了[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值