本文优化内容主要针对MySQL,有些会进行实际操作进行检验
参考
SQL优化最干货总结(2020最新版)
设计索引的原则是什么?怎么避免索引失效?
总结三点
本文所用例:mainten表
SELECT count(*) FROM or_mainten
已有索引
使用select * 取出全部列,会让优化器无法完成索引覆盖扫描这类优化,会影响优化器对执行计划的选择,也会增加网络带宽消耗,更会带来额外的I/O,内存和CPU消耗。
建议:只查询业务需要的字段
注意:只有单单order by 是无法使用到索引的
SELECT * FROM t WHERE username LIKE '%陈%' |
SELECT * FROM t WHERE username LIKE '陈%' |
实际操作测试:
如果需求是要在前面使用模糊查询,
下图REAL_MAINTEN_PERSON和status都在索引INDEX_REAL_MAINTEN_PERSON中,但是在or情况下索引失效
解决:为or条件中的每个列都建立索引,但是和索引不能建立太多相违背
select id from t where num/2=100 |
应改为:
select id from t where num=100*2 |
实际操作
选择int字段
添加索引
实际操作
添加索引
索引失效
索引正常应用
select id from t where substring(name,1,3)='abc' |
应改为:
select id from t where name like 'abc%' |
实际操作
在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
实际操作
并不是所有索引对查询都有效,如一表中有字段性别sex,男女几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
原因是当索引列有大量数据重复时,MySQL还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
惯用的百分比界线是"30%"。(匹配的数据量超过一定限制的时候查询器会放弃使用索引(这也是索引失效的场景之一哦)。
索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了
因为首先变长字段存储空间小,可以节省存储空间,
其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
我们在建立索引的时候,要为那些经常作为查询条件的字段建立索引,这样能够提高整个表的查询速度。
但是查询条件一般不是一个字段,所以一般是建立的联合索引比较多。
另外查询条件中一般会有like这样的模糊查询,如果是模糊查询请最好遵守最左前缀查询原则。
这个可以换句话说:就是尽量使用数据量小的字段作为索引。
举个例子来说,假设有两个这样的字段,一个是varchar(5),一个是varchar(200),这种情况下优先选择为varchar(5)的字段建立索引,因为MySQL在维护索引的时候是会将字段值一起维护的,那这样必然会导致索引占用更多的空间,另外在排序的时候需要花费更多的时间去对比。
那假如就要为varchar(100)建立索引呢?那就取部分数据,例如 address 类型为varchar(200),在建立索引的时候可以这么写:
CREATE INDEX tbl_address ON dual(address(20)); |
假设字段 age 类型为 int,那我们一般是这么查询的
SELECT * FROM student WHERE age=15 |
SELECT * FROM student WHERE age='15' |
MySQL中实际操作发现并不会失效的,未在其它数据库进行验证
select id from t where num is null |
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0 |
在MySQL中实际操作发现并不会放弃使用索引
SELECT * FROM t WHERE id = 1 OR id = 3 |
实际操作
本文发布于:2024-01-27 19:29:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063549942183.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |