但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息失效      需要重新搜集统计信息 3. 索引本身失效      需要重建索引 下面是一些不会使用到索引的原因 索引失效 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5)…
高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理. 一.最左前缀索引 这里先说一下联合索引的概念.MySQL中的索引可以以一定顺序引用多个列,这种索引叫做复合(联合)索引,一般的,一个联合索引是一个有序元组<a1, a2, …, an>,其中各个元素均为数据表的一列,实际上要严格定义索引需要用到关系代数,但是这里我不想讨论太多关系代数的话题,因为那样会显得很枯燥,所以这里就不再做严格定义.另外,单列索引可以看成联…
mysql 通过测试'for update',深入了解行锁.表锁.索引 条件 FOR UPDATE 仅适用于InnoDB存储引擎,且必须在事务区块(BEGIN/COMMIT)中才能生效. mysql默认情况下每个sql都是单独的一个事务,并且是自动提交事务. 测试之前需要设置成非自动提交事务,不然无法模拟并发访问: mysql> select @@autocommit; +--------------+ | @@autocommit | +--------------+ | 1 | +-----…
索引的作用是提高查询效率,其实现方式有很多种,常见的索引模型有哈希表.有序列表.搜索树等. 哈希表 一种以key-value键值对的方式存储数据的结构,通过指定的key可以找到对应的value. 哈希把值放在数组里,用一个哈希函数把key换算成一个确定位置,然后把value放在数组的这个位置.但是,多个key值经过哈希函数的换算,可能会出现同一个值,即哈希冲突,常见的解决办法是链地址法,即将所有的相同Hash值的key放在一个链表中,这样,无论有多少个冲突,都只是在当前位置给单链表增加节点. 适…
一,      分区概念  分区允许根据指定的规则,跨文件系统分配单个表的多个部分.表的不同部分在不同的位置被存储为单独的表.MySQL从5.1.3开始支持Partition. 分区和手动分表对比 手动分表  分区 多张数据表 一张数据表 重复数据的风险 没有数据重复的风险 写入多张表 写入一张表 没有统一的约束限制 强制的约束限制 MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用: Range(范围)–这种模式允许将数据划分不同范围.例如可以将一个表通过年…
字符集:指符号和字符编码的集合.校对规则:比较字符编码的方式.GBK2312:主要包括简体中文字符及常用符号,对于中文字符采用双字节编码的格式,也就是说一个汉字字符在存储占两个字节.GBK:包括有中.日.韩字符的大字符集,GB2312也是GBK的一个子集,就是说GB2312中的所有字符,GBK中全有,在这种情况下,我们也会将GBK称为GB2312的超集,GBK也是双字节编码的格式,将子集中的字符转换成超集中保存不会丢失信息(出现乱码):但反之则不一定. UTF-8:它对于英文字符集使用一个字节编…
mysql处理某个唯一索引时存在则更新,不存在则插入的情况应该是很常见的,网上也有很多类似的文章,我今天就讲讲当这个唯一的索引是多列唯一索引时可能会遇到的问题和方法. 方法一: 使用 INSERT INTO ON ... DUPLICATE KEY UPDATE ... : 表的创建如下: CREATE TABLE `test_table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `var1` varchar(100) CHARACTER SET utf…
以前学习这一块的时候,是说:假设建立了联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引. 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化. 下面是我的实测结果:(5.7版本) step1:反顺序也是可以应用索引的. step2:正常顺序更加没问题 step3:在有单列索引情况下,竟然优先使用了联合索引 step4:将idx_name_del中的索引顺序换了下,把name换前面. step5:将idx_pid_del中的索引顺序换了下,把pid换…
MySQL删除操作其实是假删除 因为近期在重构优化一个业务的时候 发现有一张表(send_log)数据量将近1700W 左右  占用数据大小17G,索引18G左右  而我们的核心应用在使用的时候 会去临时查询这张表 获取一些数据 先不管设计的合不合理吧,因为是维护  不出问题为第一要务 所以想到要物理删除一下表数据  计划把18年1000W左右数据给腾出空间  但运维执行删除操作后  发现情况没有那么理想  行数是少了  但表空间 大小 没降下去 在 InnoDB 中,你的 delete 操作,…
福哥答案2020-06-07: 答案来自群员:对于int类型id,查询的varchar 类型 ‘1’会隐式转换成 1,‘1’和 1都能正常走索引:对于varchar类型id,查询的int 类型 1不会转换,‘1’正常走索引,1走全表:…