嗨,我是《零学IT》,专注IT那点事,接下来是系列专题,Mysql优化技巧分析!
![75fd896d9338acfb58792c498577b457.png](https://img8.php1.cn/3cdc5/15483/5a0/096640bc6c9e0898.jpeg)
Mysql优化
一、聚簇索引![d7cf03c1a8cec444b264b19cbee4e7ab.png](https://img8.php1.cn/3cdc5/15483/5a0/00098e08565936ae.jpeg)
聚簇索引
1、MyISAM的主索引和二级索引都指向该数据在磁盘的位置。
实际上在MyISAM中主键索引和其他的二级索引没有什么区别。
2、InnoDB的主索引的节点与数据放在一起,二级索引的节点存放的是主键的位置。
这种主键索引方式称之为聚簇索引。
3、InnoDB默认会将表的主键作为聚簇的列;如果没有主键,则会选择第一个非空的唯一索引代替;
如果没有非空唯一索引,会隐式定义一个6字节的rowid主键来作为聚集索引
4、在InnoDB中,不要使用UUID来作为聚集索引,否则性能会很糟糕,
因为它使得聚集索引的插入变得完全随机,使得数据没有任何聚集特性。
二、覆盖索引![8e93b9e313e3ecb6937c3c85cd02006a.png](https://img8.php1.cn/3cdc5/15483/5a0/9ed193b9d9b41510.jpeg)
覆盖索引并不是一种真正的索引
覆盖索引并不是一种新的索引类型,而是一个种查询工具。
简单来说,当能通过检索索引就可以读取想要的数据,
那就不需要再到数据表(回表)中读取行了。
一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。
覆盖索引的优点:
1、索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
2、因为索引是按照列值顺序存储的,
所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
3、一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用。
4、覆盖索引对innodb表特别有用,innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询。
三、创建索引的注意事项![420c2cfa164ab333ff066102c6b43391.png](https://img8.php1.cn/3cdc5/15483/5a0/c9c32b1051b1e185.jpeg)
索引,索引
1、索引不会存储Null值的列。只要列中包含null值,就不会被包含到索引中。所以我们在设置数据库时,尽量不要让数据库字段为null。
2、使用短索引。如果一个索引列过长,最好只截取这列的前面一段内容,创建索引。短索引不仅可以提高查询速度,而且可以节省磁盘空间和IO操作。
3、索引列排序。通常where条件使用索引的话,那么order by就无法使用索引。因此如果需要索引,可以将排序列创建到复合索引中。
4、尽量不要使用like语句,如果非用不可,尽量使用like 'xxx%'的方式,如果使用like '%xxx%'的方式,索引就会失效。
5、尽量不要在列上使用函数或者计算。比如 where age + 1 = 5,这样会导致索引失效,最好改成 where age = 4。
6、不使用not in、<>等操作&#xff0c;对于not in&#xff0c;可以使用not exists代替。对于<>&#xff0c;可以使用相同效果的运算符代替。比如a<>0&#xff0c;可以使用a<0 or a>0代替。
7、对于复合索引&#xff0c;条件需要和索引列一一对应&#xff0c;如果前面的列不能使用索引&#xff0c;则后面的列也无法使用索引(最左匹配原则)。
要是有需要交流的欢迎&#xff0c;来撩&#xff01;
![16f1a329f50f5a558966622d23375b64.png](https://img8.php1.cn/3cdc5/15483/5a0/376bba77b16c9ed9.jpeg)
hi&#xff0c;来撩&#xff01;