1、全字段匹配是最棒的
假如一个Staffs 这个表,将 name,age ,pos 组合成了一个联合索引,在where条件下,能够使用到的索引越多越好。
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev';
2、最佳左前缀法则
创建索引的时候, name --> age --> pos
在使用索引的时候,也必须按照这个顺序来,不能少,顺序可以乱。
3、索引列上不计算
3、不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。
4、不能使用索引中范围条件右边的列
Explain select * from staffs where name='' and age >25 and pos='';
age > 25 这个 age 这个索引也用到了,但是 pos这个字段的索引没有起作用,失效了。
5、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
以上的SQL语句,一样的where条件,因为 select 后面的字段不一样,sql的执行效率就不一样,因为第二个语句将 * 改为了三个索引字段,使用到了覆盖索引。
6、使用不等于(!= 或者<>)的时候无法使用索引
7、注意字段的null值和 not null 对sql的影响
第一种情况,name 是一个索引,name 字段允许为null
第二种情况:name 是一个索引,name 字段不允许为null
总结就是:索引字段,这个字段是否为null 对于sql的好坏有一定的影响,需要警惕。尽可能设置为not null
8、like以通配符开头('%abc...')mysql索引失效
9、字符串不加单引号索引失效 (底层使用数据类型转换)
10、少用or,用它来连接时会索引失效
可以使用union 替代 or
接着是一个索引的练习题:
以上这些就是sql的优化的一部分。
总结了一个口诀:
全值匹配才最棒,最佳左前缀法则;
刘备大哥不能死,关羽兄弟不能断;
索引列上少计算,范围之后全完蛋;
LIKE百分写最右,覆盖索引有妙用;
不等空值还有OR,索引影响要注意;
mysql的优化是一个非常大的命题,大约分为4个大方向,我们只讲了一个方向:索引优化
- 索引优化: 合理设计索引,优化查询性能,避免全表扫描。
- 查询优化: 优化SQL查询语句,避免慢查询,提高查询效率。
- 缓存优化: 合理利用MySQL内置的缓存机制,如查询缓存、结果缓存等,减少对数据库的访问次数。
- 硬件优化: 选择合适的硬件配置,包括CPU、内存、磁盘等,提高数据库的吞吐量和响应速度。