若表中有一个联合索引(c1,c2,c3,c4),则表示c2在c1下是有序的,c3在c2下是有序的,c4在c3下是有序的。若c2断了(没有使用上索引)则c3,c4不会再有作用,其他同理
想分组就必须有序,若无序则会创建临时表并进行数据排序,有序则不会创建临时表。
mysql的引擎innodb和myisam的区别(myisam不支持事物):
因为在innodb中数据量过大,id下面挂载的数据会形成数据块,查找效率会变慢;又因为只查找id,所以只会在复合索引(id,ver)中查找,速度更快。
若engine是myisam,则效率差不多。
分页优化:
select .. from xx limit (pageNo-1)*pageSize,pageSize
若是 10000 10010,则会先查出10010条数据再过滤出后面的10条数据,效率很差。
优化 1.从业务上优化,比如只允许查找10页的数据
2.从代码上,在删除数据时设置一个标记字段is_delete为1,不要真的删除数据,这样可以利用主键索引
select .. from xx where id > (pageNo-1)*pageSize limit 10;
若真要删除数据则可以使用延迟索引
延迟索引:使用索引查询出来数据,之后把查询结果和同一张表中数据进行连接查询,进而提高查询速度!分页是一个很常见功能
select c.id,c.name from xx as c inner join
(select id from xx limit 10000,10) as t on t.id=c.id;
in和exists的效率不高
null的特殊性:列 name is null,name is not null
索引:key(普通索引),unique key(唯一索引),primary key(主键索引),fulltext(全文索引)