(转载)MySQL 索引总结

本文探讨了数据库索引的重要性及优化方法,包括如何选择合适的索引、理解索引的工作原理、利用联合索引提高查询效率等关键内容。

由于索引对数据库的查询性能有着至关重要的影响,下面是我的一些总结和体会:
一个查询一次只能使用一个索引:select name from user where name='plantegg' and age>35 , 如果Index(name); Index(age)的话,MySQL查询优化器会自动选择一个索引来使用;
MySQL选择哪个索引,可以这样来看:mysql> show index from photo;
+-------+------------+------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name               | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| photo |          0 | PRIMARY                |            1 | photo_id      | A         |      237871 |     NULL | NULL   |      | BTREE      |         |
| photo |          1 | index_random           |            1 | random        | A         |      237871 |     NULL | NULL   | YES  | BTREE      |         |
| photo |          1 | FK_photo_profile_id    |            1 | profile_id    | A         |      237871 |     NULL | NULL   |      | BTREE      |         |
| photo |          1 | FK_photo_temp_photo_id |            1 | temp_photo_id | A         |      237871 |     NULL | NULL   | YES  | BTREE      |         |
| photo |          1 | FK_photo_album_id      |            1 | album_id      | A         |      237871 |     NULL | NULL   | YES  | BTREE      |         |
+-------+------------+------------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
Cardinality越大表示索引候选分得越细(默认都是BTree索引);
你也可以试试Force Index强制使用某个索引看看速度是不是MySQL是不是查询起来更快(如果真是这样的话你需要Analyze yourTable 了,MySQL重新计算你的Cardinality以帮助他正确地选择INDEX)
仔细分析Explain的结果:重点留意Extra,Key,Rows,Select_type的结果!
小心查询中的Group by 、order by之类的,基本上这样的查询在Explain的时候都会出现: Using where; Using temporary; Using filesort
联合索引要小心使用,Index(Name,Age)时,如果where name='pp' 能使用索引,where age=25时不能使用索引;where name='pp' and age>25 能使用索引;    where name ='pp'  order by  age  能使用索引;  where  name>'pp'  order by age  不能使用索引,但是 where  name>'pp'  order by name,age  能使用索引,请仔细留意差异  ;  order by name asc age desc 将不能使用索引!
索引只有被加入到内存里的时候对你的查询才有帮助,如果索引太大根本无法放入内存这样的索引失去了意义!访问索引的时候还需要Random  Aceess  Disk这比不用索引还慢!
select  的时候能不用select * 就不要用,也就是需要哪些列只拿那些列(Hibernate那些对性能没有啥好处的),比如:在Index(Name)的时候,select * from user where name like 'pp%' 和 select name from user where name like 'pp%' 两者性能千差万别,如果有10000条符合记录的结果的话(User表总共有10亿条记录)前一个查询可能需要2分钟(假设你的系统每秒100 IOPS的样子)后一个查询可能只需要0.01秒!因为前一个查询要从硬盘上取出散布在到处的这10000条记录,后一个查询直接从内存中的索引上拿Name就够了!后一个查询你explain的时候在Extra中会看到Using Index。
永远要警惕对磁盘的随机访问,顺序读写和随机访问的性能差别是N个数量级的(顺序读写的时候你的OS、Dish Cache 这个时候大显身手)对这个问题如果感兴趣的话建议你去用C写个测试程序,随机读写的时候不断地fseek,相应地同样的功能你不要fseek而是通过顺序读写到内存中,在内存自己扔掉那些应该由磁盘去fseek的地方,应该明白我的意思吧!
5.0.27后,MYSQL就支持set profling=1了,这样可以详细分析你的SQL语句每一步骤的时间消耗了
如果order by 的时候有 limit + 索引配合的话,你会有意外惊喜的
如果你能够看到一个查询能像MySQL查询优化器那样在大脑中分解他的话,我想对你来说没啥难题了,:-)
待续,下次想到了再添加吧

基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)内容概要:本文介绍了基于实时迭代的数值鲁棒非线性模型预测控制(NMPC)双模稳定预测模型的研究与Matlab代码实现,重点在于提升系统在存在不确定性与扰动情况下的控制性能与稳定性。该模型结合实时迭代优化机制,增强了传统NMPC的数值鲁棒性,并通过双模控制策略兼顾动态响应与稳态精度,适用于复杂非线性系统的预测控制问题。文中还列举了多个相关技术方向的应用案例,涵盖电力系统、路径规划、信号处理、机器学习等多个领域,展示了该方法的广泛适用性与工程价值。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事自动化、电气工程、智能制造、机器人控制等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于非线性系统的高性能预测控制设计,如电力系统调度、无人机控制、机器人轨迹跟踪等;②解决存在模型不确定性、外部扰动下的系统稳定控制问题;③通过Matlab仿真验证控制算法的有效性与鲁棒性,支撑科研论文复现与工程原型开发。; 阅读建议:建议读者结合提供的Matlab代码进行实践,重点关注NMPC的实时迭代机制与双模切换逻辑的设计细节,同时参考文中列举的相关研究方向拓展应用场景,强化对数值鲁棒性与系统稳定性之间平衡的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值