关于SQL优化的小知识

栏目: 数据库 · 发布时间: 5年前

内容简介:不命中命中不命中

不命中

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

命中

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

前置模糊查询不命中索引

不命中

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

命中

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

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

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

对非唯一的字段,例如“性别”这种大量重复的重复值的字段,增加索引也没有什么意义。可以采用唯一账号等字段。

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

越小越简单的数据类型通常在磁盘、内存中占用少,处理起来更快,例如整型数据比字符处理开销小,因为字符串的比较更复杂,处理非常耗时。

尽量避免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。(很简单:索引命中只能是相等的情况,不能是范围匹配)


以上所述就是小编给大家介绍的《关于SQL优化的小知识》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms

Data Structures and Algorithms

Alfred V. Aho、Jeffrey D. Ullman、John E. Hopcroft / Addison Wesley / 1983-1-11 / USD 74.20

The authors' treatment of data structures in Data Structures and Algorithms is unified by an informal notion of "abstract data types," allowing readers to compare different implementations of the same......一起来看看 《Data Structures and Algorithms》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器