正在建设的网站可以随时进入吗,天津做推广的公司,北京海淀社保网站,简述建设网站的具体步骤索引相关
类型隐式转换 大坑
**字段filed1是varchar类型#xff0c;且加了索引#xff0c;如果 where filed1 123; type 可能是all#xff0c;因为123是数字类型#xff0c;mysql内部会用函数做隐式转换#xff0c;用了函数#xff0c;索引就失效了。**大数据深度分页…索引相关
类型隐式转换 大坑
**字段filed1是varchar类型且加了索引如果 where filed1 123; type 可能是all因为123是数字类型mysql内部会用函数做隐式转换用了函数索引就失效了。**大数据深度分页用主键
select field1,field2 from table limit 100000,10;
select field1,field2 from table where id 100000 limit 10;避免使用MySQL函数
MySQL内置了很多函数使用函数可能导致索引失效尽量让MySQL只做简单的增删改查。避免类型的隐式转换
varchar等字符串类型的字段被加了索引把这字段当做where条件及时目标值是数字也要加引号否则类型的隐式转换会引起索引失效的问题。避免使用函数或表达式尽量只让数据库做纯粹的增删改查。
用函数的前提是知道初始值然后在操作数据很多函数都是要传参的所以mysql只能全表查然后每次迭代将数据丢给函数处理。
表达式也是如此例如where number 1 10都会让索引失效。避免使用不等值做排除法
避免使用、!、not in、is not null、这些都会使索引失效。避免使用null值
避免字段使用null值一是影响索引mysql建索引建的是非null的值大量的null值影响了正常的Btree结构而且造成聚合函数统计如count(该字段)不准确的问题。索引无关
减少大字段查询避免使用*不说磁盘io的损耗连网络带宽都跟着损耗。 如果只select仅需字段可能会触发覆盖索引机制不用回表提高性能。
select * from table;
select field1,field2 from table;查询是否存在
select count(*) from table where...;
select field from table where ... limit 1;冗余优化
想要查询一篇文章的浏览量不用count(浏览记录)。
新建一个在文章表中建立一个浏览量的字段这使得查询的时间复杂度从O(n)变成O(1)避免join适用于大表关联小表。
如果想要join的两个表一个很大一个很小应尽量避免join。
可将小表数据全部取出来组装成数组放入编程语言的内存用编程语言的内存匹配的方式去关联。哪些场景下索引会失效
使用not in、is not null、、!、这种排除法时会导致索引失效覆盖索引除外。最左匹配原则左边的字段缺少时会出现覆盖索引除外。最左匹配原则左边的字段有区间查询导致右边的字段无法使用索引。like左边或两边加百分号。类型的隐式转换如varchar的字段使用where varchar_field 123包括join表用on连接的字段。where条件有函数或表达式。where语句包含oror中存在非索引列。大数据量对二级索引字段排序如果select * 或者其它字段这个过程涉及回表可能无法使用索引因为数据量大走索引的每条数据都需要回表代价会很大。order by字段如果排序与索引顺序不一致则可能导致索引失效如果order by的每个字段都按照索引的顺序或者反顺序则仍旧会走索引。
那些查询适合创建索引
需要唯一性约束兜底的字段。经常被查询或者作为where条件的字段、、、、、in、between、like 右百分号。经常group by或者order by的字段。delete或update被作为where条件的字段。distinct的字段。join on的连接字段需要加索引但是需要类型一致因为MySQL内部有用函数做隐式转换用了函数就不适用索引。区分度不重复度高的字段。把搜索最频繁的列放在联合索引的左侧受联合索引的最左原则影响。
那些查询不适合创建索引
数据量小一个表例如配置表总类别表可能最多几十条记录创建不创建区别不大。写多读少数据的写操作对索引字段的开销比没有索引要大而且读操作还少。区分度低的字段例如性别状态等这会导致线性查找能提升搜索效率但是不明显可加可不加。sql语句包含、!、not in、is not null无法使用索引所以专门用作排除性查找的不建议创建索引。