10 mysql选错索引】的更多相关文章

10 mysql选错索引 在mysql表中可以支持多个索引,有的sql不指定使用哪个索引,由mysql自己来决定,但是有时候mysql选错了索引,导致执行很慢. 例子 CREATE TABLE `t10` ( `id` ) NOT NULL, `a` ) DEFAULT NULL, `b` ) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`), KEY `b` (`b`) ) ENGINE=InnoDB; 往表中插入10w记录 过程 delimite…
MySQL 中,可以为某张表指定多个索引,但在语句具体执行时,选用哪个索引是由 MySQL 中执行器确定的.那么执行器选择索引的原则是什么,以及会不会出现选错索引的情况呢? 先看这样一个例子: 创建表 Y,设置两个普通索引, 创建一个存储过程用于插入数据. MySQL: 5.7.27, 隔离级别: RR CREATE TABLE `Y` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DE…
前言 又和大家见面了!又两周过去了,我的云笔记里又多了几篇写了一半的文章草稿.有的是因为质量没有达到预期还准备再加点内容,有的则完全是一个灵感而已,内容完全木有.羡慕很多大佬们,一周能产出五六篇文章,给我两个肝我都不够.好了,不多说废话了... 最近在线上环境遇到了一次SQL慢查询引发的数据库故障,影响线上业务.经过排查后,确定原因是SQL在执行时,MySQL优化器选择了错误的索引(不应该说是"错误",而是选择了实际执行耗时更长的索引).在排查过程中,查阅了许多资料,也学习了下MySQ…
前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的.但是,你写SQL语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL来确定的. 不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于MySQL选错了索引,而导致执行速度变得很慢? 我们一起来看一个例子吧. 我们先建一个简单的表,表里有a.b两个字段,并分别建上索引: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFA…
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 10) --MySQL为什么有时会选错索引? MySQL中的一张表上可以支持多个索引的,但是,往往你写SQL语句的时候不会去主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL来确定的.而MySQL有时会选择不恰当的索引,我们举一个例子来说明这种情况. CREATE TABLE `t` ( `id` ) NOT NULL, `a` ) DEFAULT NULL, `b` )…
<MySQL实战45讲>10 | MySQL为什么有时候会选错索引? 学习记录http://naotu.baidu.com/file/e7c521276650e80fe24584bc9a6dc074?token=ddcd6b16335b06aa…
背景及现象 report_product_sales_data表数据量2800万: 经测试,在当前数据量情况下,order by主键id,limit最大到49的时候可以用到索引report_product_sales_data_hq_code_orgz_id_index,大于49时就走PRIMARY主键索引. 表结构 CREATE TABLE `report_product_sales_data` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT C…
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * from table1 where id=44.如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止:有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行.可见,索引是用来定位的. 第一,通过创建唯一性…
一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) not null,pass varchar(20) not null); mysql> insert into worker values(1,'HA','123456'); mysql> insert into worker values(1,'LB',null); ERROR 1048 (2…
MySQL有一个很有意思的索引类型,叫做前缀索引,它可以给某个文本字段的前面部分单独做索引,从而降低索引的大小. 其实,Oracle也有类似的实现,对于文本,它可以通过substr的函数索引,实现同样甚至更多的功能.另外,经过探索,我们发现,原来数字和时间字段,在Oracle也可以实现类似的功能. MySQL的前缀索引 MySQL的前缀索引指的是对指定的栏位的前面几位建立的索引. Altertable Table_Name add key(column_name(prefix_len)); 或者…