1、多列索引:
多列索引的查询标准:列的查询频率、列的区分度、列的顺序 要集合实际环境,进行日常的统计分析。比如:先按栏目查询然后再对栏目下的品牌分类进行查询然后对价格查询,那么索引的顺序就应该是 index(cat_id,brand_id,price)
2、索引与排序:
对于InnoDB来说,沿着索引走一遍,那么整个查询就是有序的。因为InnoDB是聚簇索引。索引的叶子节点上含有数据
3:Extra:filesort
select goods_id ,goods_name from ecs_goods order by goods_id // 如果 goods_id 为索引的话,那么因为有goods_name 的存在 使得 MySql会先执行查询全部数据,然后再去进行排序,索引没有发挥作用,所以查询时间长。
select goods_id,goods_name from ecs_goods where cat_id>3 order by goods_id 有相应的限制,索引就用到了,时间也有下降。
尽量防止 Extra:filesort 的出现,这样就需要优化。如果一个语句中出现了 where 索引和order by 索引不一致,Extra :会出现 filesort
4:重复索引和冗余索引:
重复索引没有什么实际意义;
冗余索引对与某些场景是适用的:
index(id,tag) index(tag,id) ,这样在每次查询的时候,不管是使用id 或者使用tag 都是可以利用到索引覆盖的。从而提高查询效率
5:索引碎片和索引维护:
对于索引碎片,是由于数据在不断的变化中产生的。
修复索引碎片:需要做的是把索引和数据重新整理放好。可以通过以下方式处理:
alter table es_company engine innodb;
optimiza table es_vourcherApply;
//以上语句所做的操作对数据表没有实质影响。
6:SQL语句的优化
查询时间主要分为 查找数据时间+取数据时间+传输的时间
查找数据时间: 利用索引进行查找
取出数据时间: 用索引覆盖
传输数据时间: 将例如10000条数据分开处理
7:Sql语句不是越长越好:
比如:需求查询栏目3下的商品
select cat_id ,cat_name from cat where cat_id=3;
select goods_id,goods_name from goods where cat_id=3;
select cat_id ,cat_name,goods_id,goods_name from cat left join goods where cat_id=3;
以下的实现方式会出现多次 cat_id,cat_name 的情况
cat_id | cat_name | goods_id | goods_name |
1 | PHONE | 10 | NOKIA |
1 | PHONE | 20 | HUIWEI |
1 | PHONE | 30 | OPPO |