or 让索引失效的情况

首先,or 让索引失效是有条件的,并不是使用or就让索引失效。

or本身无罪。


OR会引起索引失效的说法是这样来的:
如果是这样一个查询
SELECT * FROM TB WHERE A=1 AND B>2 AND C<3 AND D IN (4,5,6)
并且在TB表上有这样一个索引:CREATE INDEX INX_TB_ABCD ON TB (A,B,C,D)
那么这个查询可以用到这个索引
如果同样是这个索引,查询换成
SELECT * FROM TB_ WHERE A=1 OR B>2 OR C<3 OR D IN (4,5,6)
那么这个查询就用不到上面那个索引,因为结果集是几个条件的并集,最多只能在查找A=1的数据时用索引,其它几个条件都需要表扫描,那优化器就会选择直接走一遍表扫描,所以索引就失效了。

那么像第二个查询这样的应该怎么建索引呢,答案就是四个列上各建一个索引,或者只在选择性最高的列上建索引,比如A=1的数据量很少,就在A上建,如果D是4,5,6的数据很少,就在D上建,这样优化器就会选择先走索引查找,再对找出的结果集进行筛选,扫描数就会大幅减少。

回过头来看你上面那个查询,两个条件都在TID上,所以只有TID上有一个索引就OK了,不存在索引失效的问题。

看书不要全信,多想想书上为什么这么说,自己多试试。


以下是引用:http://www.cnblogs.com/hongfei/archive/2012/10/20/2732589.html

索引并不是时时都会生效的,比如以下几种情况,将导致索引失效

  1. 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

2.对于多列索引,不是使用的第一部分,则不会使用索引

3.like查询是以%开头

4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

此外,查看索引的使用情况

show status like ‘Handler_read%’;
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next:这个值越高,说明查询低效

最好的哥们,要会家乡发展了。以后估计都不会再太多在这个城市停留。

奔向各自在不同的战场,这几天有点感伤。感觉到那么些孤单。
但是,还是要祝福他,一切顺利。

一年有一年,我们都在成长,为生活奔波。

windows与linux的成本和选择

抛开系统安全性等,只考虑成本。

或者说为了达到相同稳定性,安全性的条件下考虑付出的成本。
我觉得从成本计算:windows server更适合中小企业,而大型企业使用linux 更合适。
windows服务器系统有很好的技术支持,但是初装费高昂,
linux服务器系统的有很低廉甚至免费的初装费用,但是不提供技术支持或者需要另外付费购买。


那么为了达到相同的安全性,稳定性效果。

windows服务器,需要很低的维护人员成本(维护人员技术水平要求不高,薪水也少),
linux需要更多的维护人员成本(linux有更高的门槛,维护人员技术水平要求更高,薪水也更多)。

但是window服务器初装费用是按台计算的,大型公司,服务太多的话,购买成本就会非常高。购买100台或者500台的成本差距太大。
但是如果使用linux,相比windows购买成本,招聘维护人员的人力成本就相对要少。因为10个人可以管理100台服务器,也可以管理500台服务器,并不需要增加太多的人力成本。

所以,中小企业更适合使用windows系统作为服务器,以降低维护成本。

而大型巨型企业更适合使用linex系统作为服务器,以降低购买成本。

3

一支笔,朴素文艺

一张桌子,宁静沉稳

一部手机,一台手机,一支歌,将是我创造奇迹的起点

2014 见证我们