Mysql 索引优化

本文介绍了MySQL中索引的存储分类、不同引擎的特点、如何高效利用索引来提高查询性能,以及提供了两个实用的表优化技巧。同时,还讨论了在特定场景下索引可能无法正常工作的例子。

1、索引的存储分类

MyISAM存储引擎的表数据和索引是自动分开存储的,各自是独一的一个文件

Innodb存储引擎的表数据和索引是存储在同一个表空间里面,但可以由多个文件构成。

Mysql 目前不支持函数索引,但是能对列的前面某一部分进行索引

例如name字段,可以只取name的前4个字符进行索引,可降低索引文件大小。

Mysql> create index ind_company_name on company(name(4));

说明:ind_company_name索引名,company表名


2、使用like的查询,后面如果是常量,并且%号不在第一个字符,索引才可能被用上

eg: Mysql> select * from t1 where id like "3%"; 推荐

      Mysql> select * from t1 where id like "3%"; 不推荐 (索引用不上)


3、如果对大的文本进行索引,使用全文索引而不使用like"%....%"


4、如果列名是索引,使用column_name is Null 将使用索引。

eg: Mysql> desc select * from company where name is null\G


5、存在索引但不使用索引


6、如果Mysql估计使用索引比全表扫描更慢,则不使用索引。


例如:如果列Key_part均匀的分布在1-100之间,查询时使用索引就不好。

eg:Mysql> select * from table_name where key_part>1 and key_part<90;


7、如果使用MEMORY/HEAP 表并且where条件中不适用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。


8、用or分割开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及的索引都不会被使用。


9、如果不是索引列的第一部分,那么查询中这个索引也不会被Mysql采用。

eg: Mysql> desc select * from sales where moneys=1\G

Moneys上面建有复合索引,但是moneys不是索引的第一列。


10、如果列类型是字符串,但是查询时把一个数值型常量复制给了一个字符型的列名name,那么虽然name列有索引,也不会使用。

eg: Mysql> desc select * from company where name=123\G  (字符串索引使用整形数据查询,不会使用索引)

      Mysql> desc select * from company where name="123"\G (使用上索引)


查看Mysql索引使用情况


Mysql> show status like 'Handle_read%';


如果索引正在工作,Handler_read_key的值将很高,这个值代表索引被使用次数。

Handler_read_rnd_next的值高意味着查询运行低效,并且应该建立索引补救。


2个简单实用的优化技巧

a、定期分析表和检查表

Mysql> ANALYZE  [LOCAL | NO_WRITE_TO_BINLOG] TABLE tab_name [,tab_name1]...;

本语句用于分析和存储表的关键字分布,分析结果可以使系统得到准确的统计信息。使SQL能够生成正确的行计划。

eg: Mysql> analyze table sales;

分析表的语法如下: (检查一个或多个表是否有错误)

Mysql> CHECK TABLE tab_name [,tab1_name]...[option]...option={QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

eg: Mysql> check table sales;


b、定期优化表

优化表的语法格式:

Mysql> OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] tab_name [,tab_name1]..

如果已经删除了表的一大部分,或者已经对含有可变长度行的表进行了很多的改动,则需要定期优化。

这个命令可以将表中的空间碎片进行合并,但是只对MyISAM、BDB和Innodb表起作用。

eg: Mysql> optimize table sales;   (不要在Mysql访问数大的情况下使用)


常用SQl的优化 

大批量插入数据

当用load命令导入数据的时候,适当设置可以提高导入速度

对于MyIASM存储引擎的表,可以用个一下方式快速导入大量数据

ALTER TABLE Tab_name DISABLE KEYS loading the data

ALTER TABLE Tab_name ENABLE KEYS

DISABLE KEYS 和 ENABLE KEYS 用来打开或关闭MyISAM表非唯一索引的更新,可以提高速度,对Innodb无效。

MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值