根据DB引擎选择合适的索引进行查询优化

news/2024/7/10 4:23:04 标签: 引擎, 优化, 数据库, mysql, sql

对MySQL DB,有如下的SQL语句:
SELECT pk FROM tbl_name WHERE cond = ... ORDER BY time DESC ;

      这里pk是我们需要进行select出来的字段,它是主键,因此系统自动为其建立对应的索引结构,where子句下面的选择条件cond字段和order by 的time字段,从广义上可以理解为我们选择记录的过滤条件,为了提高查询的速度(本质就是过滤记录的速度),我们都知道会建立Index(cond, time)的联合索引来提高速度。

     如果我们的数据库引擎是InnoDB,那么建立Index(cond,time)的复合索引是最佳答案,因为在InnoDB里,索引结构有一个特殊的地方:非主键索引在其B树的叶节点上会额外保存对应主键的值,这样不用再到数据文件里去取主键pk的值,而可以直接在索引里得到它。

    如果我们的数据库引擎是MyISAM,那么建立Index(cond,time)复合索引就不是最佳答案。因为MyISAM的索引结构里,非主键索引并没有额外保存对应主键的值,应该建立Index(cond,time,pk)三级的复合索引。
   附:
    建立索引的时候,先show index from tbl_name查看Cardinality的值,Cardinality表示唯一值的个数,一般来说,如果唯一值个数在总行数中所占比例小于20%的话,则可以认为Cardinality太小,此时索引除了拖慢insert/update/delete的速度之外,不会对select产生太大作用;还有一个细节是建立索引的时候未考虑字符集的影响,比如说username字段,如果仅仅允许英文,下划线之类的符号,那么就不要用gbk,utf-8之类的字符集,而应该使用latin1或者ascii这种简单的字符集,索引文件会小很多,速度自然就会快很多。


http://www.niftyadmin.cn/n/1738175.html

相关文章

算法-机器学习-K-means

K-means算法 K-means算法 步骤: 输入样本为;选择初始化的个类别中心;对于每个样本,将其标记为距离类别中心最近的类别(使用欧几里得距离);更新每个类别的中心点为隶属该类别的所有样本的均值…

数据库创建索引的一些原则

一,经常被用来过滤记录的字段。 1. primary key 字段, 系统自动创建主键的索引; 2. unique kye 字段,系统自动创建对应的索引; 3. foreign key 约束所定义的作为外键的字段; 4. 在查询中用来连接表的字段; 5. 经常用来作为排序(order by…

数据库索引杂谈1

●聚集索引结构 在SQL Server中,索引是按B树结构来进行组织的。聚集索引的数据排列顺序与数据的物理排列顺 序相同。 ●聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致. 聚集索引表记录的排列…

Linux文件锁的几个要点

文件锁是Linux上最常用的进程间同步机制之一,相比sysv的信号量,文件锁更容易使用(sysv信号量的麻烦之处在于它的key获取机制)。 APUE对文件锁做了详尽的描述,其中需要注意的有以下几点,原文可参见APUE2的…

算法-机器学习-GBDT

转载自:GBDT算法原理以及实例理解 以后再自己总结

fcntl文件锁详解

fcntl文件锁有两种类型:建议性锁和强制性锁建议性锁是这样规定的:每个使用上锁文件的进程都要检查是否有锁存在,当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁,它们依靠程序员遵守这个规定。 强制性锁是由内核执行…

深度学习-算法-LSTM、GRU

1 LSTM简介 LSTM,Long-Short Term Memory RNN,长短期记忆模型循环神经网络 LSTM是RNN的一个变种,为了解决RNN模型梯度弥散的问题而提出的; 在传统的RNN中,训练算法使用的是BPTT,当时间比较长时&#xff…

shmget() -- 建立共享内存

#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);key_t key----------------------------------------------- key标识共享内存的键值: 0/IPC_PRIVATE。 当key的取值为IPC_PRIVATE&#xff0c;则函数shmget()将创建一…