INSERT
INTO `jobs`(`job_id`,`job_title`,`min_salary`,`max_salary`)
VALUES ('AC_ACCOUNT','Public Accountant',4200,9000);
INSERT
INTO jobs(job_id,job_title,min_salary,max_salary)
VALUES ('AC_ACCOUNT','Public Accountant',4200,9000);
使用mysql,这两段插入语句都可以正确执行,但不明白为什么上一个要加反引号
希望能告诉我这个反引号需要在哪个版本,或者什么情况下使用
我在学习sql server的时候并没有讲需要加上反引号
mysql是这样的,反引号就是怕跟关键词特殊字符这些重复,sql server不需要
如果字段,表名都没有mysql关键字,那么可加,可不加,如果表名,字段中存在关键字,那就需要加反引号把关键字包含起来,这样就能确保查询的数据是你数据库的表名或者字段而不是mysql的关键字,比如下边这个describe是关键字,不加反引号就报错
对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。 我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。
执行计划包含的信息 id 有一组数字组成。表示一个查询中各个子查询的执行顺序;
select_type 每个子查询的查询类型,一些常见的查询类型。
id | select_type | description |
---|---|---|
1 | SIMPLE | 不包含任何子查询或union等查询 |
2 | PRIMARY | 包含子查询最外层查询就显示为 PRIMARY |
3 | SUBQUERY | 在select或 where字句中包含的查询 |
4 | DERIVED | from字句中包含的查询 |
5 | UNION | 出现在union后的查询语句中 |
6 | UNION RESULT | 从UNION中获取结果集,例如上文的第三个例子 |
table 查询的数据表,当从衍生表中查数据时会显示 x 表示对应的执行计划id partitions 表分区、表创建的时候可以指定通过那个列进行表分区。 举个例子:
create table tmp (
id int unsigned not null AUTO_INCREMENT,
name varchar(255),
PRIMARY KEY (id)
) engine = innodb
partition by key (id) partitions 5;
type(非常重要,可以看到有没有走索引) 访问类型
possible_keys 可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。
key 显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。
TIPS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中
key_length 索引长度
ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows 返回估算的结果集数目,并不是一个准确的值。
extra 的信息非常丰富,常见的有:
【推荐】SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是consts最好。
说明:
1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
2) ref 指的是使用普通的索引(normal index)。
3) range 对索引进行范围检索。
反例:explain表的结果,type=index,索引物理文件全扫描,速度非常慢,这个index级别比较range还低,与全表扫描是小巫见大巫。
在MySQL中,反引号(`)被用来标识字段名、表名和别名等以避免这些名称与关键字冲突。在不使用反引号时,如果使用了MySQL的关键字来命名字段,表名或别名,MySQL将会产生语法错误。
例如,以下SQL语句会产生语法错误:
CREATE TABLE 'person' (
'name' VARCHAR(255),
'group' VARCHAR(255)
);
正确的写法是:
CREATE TABLE `person` (
`name` VARCHAR(255),
`group` VARCHAR(255)
);
可以看到,在这个例子中,表名和字段名被反引号包裹,这样MySQL将不会把它们当成关键字解释。
需要注意的是,这种情况随着MySQL版本的更新可能会变化,所以如果在开发中使用反引号,请确认MySQL版本是否支持使用反引号。另外,在SQL Server中并不需要使用反引号来避免关键字冲突,所以在学习SQL Server时可能没有接触到这种情况。
如果需要在插入语句中使用反引号,可以这样写:
INSERT INTO `person` (`name`, `group`) VALUES ('Tom', 'A');
在这个例子中,字段名被反引号包裹,这样就能避免由于使用了MySQL的关键字作为字段名而导致的语法错误。
关于性能优化问题,请参考参考资料中的内容。