当表有索引的时候,每个select语句都会先扫描索引,索引是有序存储的并且以搜索为目标进行了优化
如果没有加索引,那么每一句select语句都要随机地逐条扫描整个表
索引的另一个用途是快捷高效地在相关表之间做连接操作,在需要连接的列上使用索引可以显著提高性能
创建索引:alter table 表名 add index (列名)
如果查找的是以通配符开头select * from artist where name like '%Queen'则mysq不会使用索引,但可以这么查name like REVERSE('% Queen')
mysql不支持基于索引的函数,select * from artist where upper(name) = upper('Billy Joel') name列上加了索引,当在name列上使用函数的时候,mysql就不会使用name列上的索引
当知道数据确实是唯一的情况下,把索引定义为唯一索引是非常好的方式alter table artist drop index name,add unique index(name)
创建多列索引alter table 表名 add primary key 索引名字 (列名1,列名2...)
alter table album add index m1 (country_id,album_type_id)
多列索引最左边的列可以被当作单一列索引来使用,当这些多列被用于group by或order by时最左边的列也可以显著提高性能
where order by group by的条件可以拼索引
隐藏秘籍:
1.删除重复索引
name2中最左项last_name被包含在name1中,可将name1删掉
2.监控无效的索引
3.改进索引列
列类型的优化
1.IPv4定义为INT UNSIGNED只占4字节,通常定义为VARCHAR(15)平均占用12字节
2.MD5用CHAR(32)来存储。
其他优化:
Key_len: