是昨天同事那里针对sql的优化问题。
一开始发现left join后面的临时标出结果比较慢,在测试数据库中测试不到4000的数据居然花费了近20秒。(而实际上,真实表是由2万多条数据的,呵呵)
explain该语句发现小数据的表居然时全查询(index),似乎是索引没有起作用。
但是这个表的索引是手动建立好的,甚至之后索引还重新删除重建了一次。索引依旧没有起作用。
表现为哪怕是普通的select * from a的语句,都需要5秒左右才能出结果。
只好查资料,找高手了,发现是那张表的数据有问题。在表中,发现有40多条数据的id是显示为空的。高手说,表中索引的选定的字段是null值,会导致mysql索引失效。和那边的人沟通后确认似乎实在业务设计的时候,就故意指定该列为空。而这些数据还都是必须显示的。
马上都到要交付的时候了,只能和接口人扯皮了。两个方案:1,将这个表的索引列修改为某个参数,(假装是空的),使索引生效。后面再有新数据呢?需要和写数据的人沟通联调。
2.再建一个表。这个具体的我还是不太懂原因。但是没有什么优势。
* 需要说明一下这个索引列好像是id,官方的意思使索引列必须是唯一的值即不能重复,才会生效
以下在学习一下,Mysql索引的概念和用处
Mysql索引概念
在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。
Mysql索引引擎的种类
FULLTEXT,HASH,BTREE,RTREE。
具体详见:
Mysql几种索引类型的区别及适用情况
水平有限,目前只知道btree和hash两个(能看懂)
索引的类型
普通索引
无限制
唯一索引
索引列的值必须唯一,但允许有null。但是组合索引,列表之组合必须唯一
全文索引
几乎看不懂,不清楚用法,不明白实际意义。似乎是在MyISAM表中使用,应该是一些报社或者教育类的应用在使用吧。(逗比)
单列索引,多列索引
组合索引
索引工作原理
类似看书之前都会想看书的目录(索引),找到对应的章节,对应的页码后就可以快速查看需要的内容,
Mysql中,引擎使用类似的方法,首先在索引中查找值,然后根据匹配的索引找到对应的数据行,然后将其返回给客户端。
MySQL索引背后的数据结构及算法原理
索引的用法
见 索引优化
索引的优化
脑袋疼,还是从基础开始学习吧。
吐槽一下,管理,csdn对于360浏览器的支持是什么情况,
谷歌是正常的,难道是我网速的问题??!