阿里规范 - 五、MySQL 数据库 - (二)索引规约 - 10 - 【推荐】防止因字段类型不同造成的隐式转换,导致索引失效。

1、“列类型”与“where值类型”不符

2、join时

相join的两个表的字符编码不同,不能命中索引,会导致笛卡尔积的循环计算(nested loop)。

参考 : https://mp.weixin.qq.com/s/1Sowt2TcjMGDv55OQOe2rQ

原文地址:https://www.cnblogs.com/light-train-union/p/12222759.html

时间: 2024-11-23 06:40:19

阿里规范 - 五、MySQL 数据库 - (二)索引规约 - 10 - 【推荐】防止因字段类型不同造成的隐式转换,导致索引失效。的相关文章

MySQL性能优化:MySQL中的隐式转换造成的索引失效

数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很小的疏忽造成的,又或者是因为不了解某个技术特性产生的. 于数据库层面,最常见的恐怕就是索引失效了,且一开始因为数据量小还不易被发现.但随着业务的拓展数据量的提升,性能问题慢慢的就体现出来了,处理不及时还很容易造成雪球效应,最终导致数据库卡死甚至瘫痪.造成索引失效的原因可能有很多种,相关技术博客已经有

JAVA使用JDBC连接MySQL数据库 二(2)

本文是对 <JAVA使用JDBC连接MySQL数据库 二>的改进. 上节使用的是PreparedStatement来执行数据库语句,但是preparedStatement需要传递一个sql语句参数,才能创建.然而,DBHelper类只是起到打开和关闭数据库的作用,所以sql语句是要放到应用层部分的,而不是放到DBHelper类中. 而statment不需要传递一个sql语句参数,就能创建. 修改部分如下: public class DBHelper { String driver = &quo

MySQL学习笔记_12_Linux下C++/C连接MySQL数据库(二) --返回数据的SQL

 Linux下C++/C连接MySQL数据库(二) --返回数据的SQL 引: 返回数据的SQL是指通过查询语句从数据库中取出满足条件的数据记录 从MySQL数据库值哦功能检索数据有4个步骤: 1)发出查询 2)检索数据 3)处理数据 4)整理所需要的数据 用mysql_query()发出查询,检索数据可以使用mysql_store_result()或mysql_use_result(),取决与怎样检索数据,接着是调用mysql_fetch_row()来处理数据,最后,还必须调用mysql_

MySQL SQL优化之字符串索引隐式转换

之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结构: CREATE TABLE `test_1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(30) NOT NULL, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`),

MySQL数据库使某个不是主键的字段唯一

在使用MySQL数据的过程中有时候我们需要某个不是主键的字段不重复,这个时候就要用到SQL的UNIQUE约束了. 下面摘抄自w3school里的一段介绍: UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 UNIQUE 约束. 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束. 下面在 "Persons" 表创建时在

Mysql中的隐式转换

在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引,下面分析两种隐式转换的情况看表结构phone为int类型,name为varchar类型 EXPLAIN select * from user where phone   = '2' EXPLAIN select * from user where phone   = 2 两种情况都可以用到索引,这次等号右侧是'2',注意带单引号哟,左侧的索引字段是int类型,因此也会发生隐式转换,但因为int类型的数

关于MySQL隐式转换

一.如果表定义的是varchar字段,传入的是数字,则会发生隐式转换. 1.表DDL 2.传int的sql 3.传字符串的sql 仔细看下表结构,rid的字段类型: 而用户传入的是int,这里会有一个隐式转换的问题,隐式转换会导致全表扫描. 把输入改成字符串类型,执行计划如下,这样就会很快了. 此外,还需要注意的是: 数字类型的0001等价于1 字符串的0001和1不等价 二.如果表定义的是int字段,传入的是字符串,在不超过int范围内,不会发生隐式转换,如果超出范围并且比较大小(以字符串类型

【C++自我精讲】基础系列五 隐式转换和显示转换

0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐式转换 定义:隐式转换是系统跟据程序的需要而自动转换的. 1)C++类型(char,int,float,long,double等)的隐式转换: 算术表达式隐式转换顺序为: 1.char - int - long - double 2.float - double //1)算术表达式 int m = 10; double n = m;//n = 10

PHP MySQL数据库二

三.MySQL常用函数 文本函数 函数 用法 描述 CONCAT() CONCAT(x,y,...) 创建形如xy的新字符串 LENGTH() LENGTH(column) 返回列中储存的值的长度 LEFT() LEFT(column,x) 从列的值中返回最左边的x个字符 RIGHT() RIGHT(column,x) 从列的值中返回最右边的x个字符 TRIM() TRIM(column) 从存储的值删除开头和结尾的空格 UPPER() UPPER(column) 把存储的字符串全部大写 LOW