关于MySQL数据库的数据类型发生隐形转换的问题咨询

网友的问题:

1.MySQL对于int类型索引使用问题,如:tb中有主键id,普通索引tid,在执行SQL:select * from tb where id = 2 order by id 时,
extra为空,这里的id值没带引号,如果带上引号extra也为空。

2.当 select * from tb where tid = 2 order by tid,tid为普通索引,这时tid的值带引号和不带引号就会有区别,带引号时extra会提示额外的排序,不带引号时extra为空,这是怎么一回事?
zhdba

mysqlops的回答:

1.当字段类型为:INT;

MySQL数据库InnoDB存储引擎查询优化器实现的分析之单表unique查询

1.1     单表unique查询

select * from nkeys where c3 = 3;

调用流程:
mysql_execute_command -> handle_select -> mysql_select -> JOIN_optimize -> make_join_statistics ->
if ((table->key_info[key].flags & (HA_NOSAME | HA_END_SPACE_KEY)) == HA_NOSAME) ->

  1. 若当前索引为unique索引,同时

if (const_ref == eq_part) ->

  1. 指定的等值条件与当前索引的unique key一致

由浅入深理解索引的实现(1)

00 – 背景知识

- B-Tree & B+Tree

  http://en.wikipedia.org/wiki/B%2B_tree
  http://en.wikipedia.org/wiki/B-tree

- 折半查找(Binary Search)

  http://en.wikipedia.org/wiki/Binary_search_algorithm

- 数据库的性能问题

  A. 磁盘IO性能非常低,严重的影响数据库系统的性能。
  B. 磁盘顺序读写比随机读写的性能高很多。

- 数据的基本存储结构

  A. 磁盘空间被划分为许多大小相同的块(Block)或者页(Page).
  B. 一个表的这些数据块以链表的方式串联在一起。
  C. 数据是以行(Row)为单位一行一行的存放在磁盘上的块中,如图所示.
  D. 在访问数据时,一次从磁盘中读出或者写入至少一个完整的Block。

                   Fig. 1

InnoDB引擎表的主键选型

导读

MySQL采用开放可插入式存储引擎架构,提供类似电源插线板的功能,其后接入的存储引擎就类似电器设备,而我们大家常用的存储以MyISAM和InnoDB为主,早期大家主要使用MyISAM引擎支持业务,随MySQL支持业务范围越来越广,存储的数据对企业越来越重要,尤其PC服务器支持的最大内存越来越大,内存的价格也越来越便宜,逐渐采用InnoDB引擎为主.二种风格迥异的存储引擎,各自内部存储算法和数据操纵实现等都竞相不同,另外InnoDB引擎与其他商业数据库产品存储引擎也不太相同,为此我们必须根据使用的存储引擎特点,设计合理的数据存储结构和数据操纵方式。本文将围绕InnoDB存储引擎的主键设计而展开,告诉大家怎样设计表的主键才是合理的做法。

SQL优化篇:数据类型隐形转换的危害

导读

曾经写过一篇文章介绍MySQL中创建及优化索引组织结构的思路,但是没有提及关于SQL语句中隐性转换的问题,近期一位网友发现他们系统中业务场景中存在此问题,为此专门分析数据类型隐性转换的威力,告诉大家编写SQL语句时,也许一对单引号就可以引发一场血案。

示例校验的环境

软件环境

MySQL版本:5.1.40、5.1.15

存储引擎:Innodb

操作系统:Linux version 2.6.18-194.el5

数据环境

创建用于测试的表结构:

CREATE TABLE tmp_index_len(ID INT UNSIGNED NOT NULL AUTO_INCREMENT,

                           cate_id MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,

                           brand_name VARCHAR(50) NOT NULL DEFAULT ”,

                           CreateDate TIMESTAMP NOT NULL DEFAULT ’0000-00-00 00:00:00′,

                           PRIMARY KEY(ID),

                           INDEX idx_cid_bname(cate_id,brand_name)

                        )ENGINE=InnoDB CHARACTER SET ‘utf8′ COLLATE ‘utf8_general_ci’;

深入理解Facebook 消息应用服务器

摘要: 要点: Facebook 统一消息系统(邮件、短信、聊天、消息等); 用 HBase 作为后端存储设施,每个用户数据存储在 HBase 的单独一行里,每个实体(文件夹、主题、消息等等)都存储在自己的HBase列中; 涉及 H…

要点:

  1. Facebook 统一消息系统(邮件、短信、聊天、消息等);
  2. 用 HBase 作为后端存储设施,每个用户数据存储在 HBase 的单独一行里,每个实体(文件夹、主题、消息等等)都存储在自己的HBase列中;
  3. 涉及 HayStack 图片处理基础设施;
  4. 使用 Apache Lucene 维护反向索引列表;
  5. 镜像了大约 10% 用户的实时聊天和收件箱中的信息到测试集群中,并通过 dark launch 进行测试。

MySQL中创建及优化索引组织结构的思路

导读

通过一个实际生产环境中的数据存取需求,分析如何设计此存储结构,如何操纵存储的数据,以及如何使操作的成本或代价更低,系统开销最小。同时,让更多初学者明白数据存储的表上索引是如何一个思路组织起来的,希望起到一个参考模板的价值作用。

测试用例描述

测试用例为B2C领域,一张用于存储用户选购物品而生成的产品订单信息表,不过去掉一些其他字段,以便用于测试,其表中的数据项也不特别描述,字段意思见表