mysql索引优化实例分享

发布时间:2020-03-13编辑:脚本学堂
分享一个mysql索引优化的例子,学习下mysql索引的用法,有需要的朋友做个参考。

mysqlsuoyin/ target=_blank class=infotextkey>mysql索引优化的例子:
某个sql语句后出现大量的lock,有很多其他查询被阻塞。当前表的索引结构。
发现这个问题是show processlist结合slow query log发现的。
 

复制代码 代码示例:
mysql> show index from t_slide;
+---------+------------+-----------------------+--------------+-------------+
| Table   | Non_unique | Key_name              | Seq_in_index | Column_name |
+---------+------------+-----------------------+--------------+-------------+
| t_slide |          0 | PRIMARY               |            1 | Fslide_id   |
| t_slide |          1 | Fuser_id              |            1 | Fuser_id    |
| t_slide |          1 | Fcategory             |            1 | Fcategory   |
| t_slide |          1 | Fdomain_key           |            1 | Fdomain_key |
| t_slide |          1 | idx_t_slide_fadd_time |            1 | Fadd_time   |

执行的SQL语句:
 

复制代码 代码示例:
SELECT * FROM t_slide WHERE Fuser_id=200468950 and (Fstatus=1 or Fstatus=4) and Fshare_set<>9 ORDER BY Fadd_time DESC LIMIT 0,20;

这个用户有9W多行的数据,使用explain分析sql执行过程,耗时8秒,使用的索引是idx_t_slide_fadd_time。
等于是先按照全局排序在去找数据。

经过分析后强制使用索引Fuser_id,让MYSQL先找到用户在处理。强制使用索引用use index
 

复制代码 代码示例:
SELECT * FROM t_slide use index(Fuser_id) WHERE Fuser_id=200468950 and (Fstatus=1 or Fstatus=4) and Fshare_set<>9 ORDER BY Fadd_time DESC LIMIT 0,20;

速度提升到2秒,虽然还是慢,但已不是那么严重了。

mysql索引优化如果使用联合索引将Fuser_id,Fadad_time字段放到一起做索引。速度超快,提升效果明显。
 

alter table t_slide add index SLIDE_TIME (Fslide_id,Fadd_time);

下面介绍下mysql索引的用处。

MySQL索引在mysql数据库中,可以有效提高查询的效率,尤其是查询数据量非常大时,效果更为明显,往往能使查询速度加快成千上万倍。

MySQL索引作用

在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。

例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据组成,指为1~1000的数值,查找对应值相等行的查询如下所示。

SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
此查询结果应该为1000行,每行包含3个相等的值。在无索引的情况下处理此查询,必须寻找3个表所有的组合,以便得出与WHERE子句相配的那些行。而可能的组合数目为1000×1000×1000(十亿),显然查询将会非常慢。

如果对每个表进行索引,就能极大地加速查询进程。
利用索引的查询处理如下。
1,从表t1中选择第一行,查看此行所包含的数据。
2,使用表t2上的索引,直接定位t2中与t1的值匹配的行。类似,利用表t3上的索引,直接定位t3中与来自t1的值匹配的行。
3,扫描表t1的下一行并重复前面的过程,直到遍历t1中所有的行。
在此情形下,仍然对表t1执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。

利用MySQL索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在执行连接时加快了与其他表中的行匹配的速度。

分享:Mysql索引优化的技巧
深入理解Mysql的列索引和多列索引
了解 MySQL 主键与索引的联系与区别
mysql性能优化之索引优化