关于SQL优化的小知识

负向查询不命中索引

不命中sql

select account from user where id not in (1,2,3);
复制代码

命中数据库

select account from user where id in (4,5,6);
复制代码

前置模糊查询不命中索引

不命中工具

select account from user where name like '%lufei'
复制代码

命中优化

select account from user where name like 'lu%fei%'
复制代码

建议能够考虑使用 Lucene 等全文索引工具来代替频繁的模糊查询。spa

数据区分不明显不建议索引

对非惟一的字段,例如“性别”这种大量重复的重复值的字段,增长索引也没有什么意义。能够采用惟一帐号等字段。code

越小越简单的数据类型建议索引

越小越简单的数据类型一般在磁盘、内存中占用少,处理起来更快,例如整型数据比字符处理开销小,由于字符串的比较更复杂,处理很是耗时。cdn

尽可能避免null

索引字段应该制定列为NOT NULL 。含有空值得列很难进行查询优化,由于他们使得索引、索引的统计信息以及比较运算增长复杂,应该用0或者特殊值、空字符代替。索引

在字段上进行计算不能命中索引

索引列不能参与计算,尽可能保持列“干净”。好比,FROM_UNIXTIME(create_time) = '2016-06-06' 就不能命中索引。 不命中内存

select account from user where FROM_UNIXTIME(create_time) = CURDATE();
复制代码

命中开发

select account from user where create_time = FROM_UNIXTIME(CURDATE());
复制代码

表表链接索引

表与表链接用于多表联合查询的约束条件的字段应当创建索引,而且进行 join 的字段两表的字段类型要相同,否则也不会命中索引。

字段类型强制转换不命中索引

不命中

select account from user where phone = 1341111111
复制代码

命中

select account from user where phone = '1341111111'
复制代码

若是知道是一条记录,使用limit

select account from user where phone = '1341111111' limit 1
复制代码

能够提升效率,让数据库中止游标移动。

最左匹配

最左前缀匹配原则。MySQL会一直向右匹配直到遇到范围查询(>,<,BETWEEN,LIKE)就中止匹配。 若有索引(a, b, c, d),查询条件a = 1 and b = 2 and c > 3 and d = 4,则会在每一个节点依次命中a、b、c,而没法命中d。(很简单:索引命中只能是相等的状况,不能是范围匹配)

我的博客

www.ccode.live/bertonlee/l…

欢迎关注公众号“码上开发”,天天分享最新技术资讯

相关文章
相关标签/搜索