Mysql如何避免全表扫描的方法
在以下几种条件下,MySQL就会做全表扫描:
1>数据表是在太小了,做一次全表扫描比做索引键的查找来得快多了。当表的记录总数小于10且记录长度比较短时通常这么做。
2>没有合适用于 ON 或 WHERE 分句的索引字段。
3>让索引字段和常量值比较,MySQL已经计算(基于索引树)到常量覆盖了数据表的很大部分,因此做全表扫描应该会来得更快。
4>通过其他字段使用了一个基数很小(很多记录匹配索引键值)的索引键。这种情况下,MySQL认为使用索引键需要大量查找,还不如全表扫描来得更快。
对于小表来说,全表扫描通常更合适。但是对大表来说,尝试使用以下技术来避免让优化程序错误地选择全表扫描:
1>执行 ANALYZE TABLE tbl_name 更新要扫描的表的索引键分布。
2> 使用 FORCE INDEX 告诉MySQL,做全表扫描的话会比利用给定的索引更浪费资源。
SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
WHERE t1.col_name=t2.col_name;
3>启动 mysqld 时使用参数 --max-seeks-for-key=1000 或者执行 SET max_seeks_for_key=1000 来告诉优化程序,所有的索引都不会导致超过1000次的索引搜索。
相关推荐
-
Mysql如何避免全表扫描的方法
在以下几种条件下,MySQL就会做全表扫描: 1>数据表是在太小了,做一次全表扫描比做索引键的查找来得快多了.当表的记录总数小于10且记录长度比较短时通常这么做. 2>没有合适用于 ON 或 WHERE 分句的索引字段. 3>让索引字段和常量值比较,MySQL已经计算(基于索引树)到常量覆盖了数据表的很大部分,因此做全表扫描应该会来得更快. 4>通过其他字段使用了一个基数很小(很多记录匹配索引键值)的索引键.这种情况下,MySQL认为使用索引键需要大量查找,还不如全表扫描来得更快.
-
MySQL中的全表扫描和索引树扫描 的实例详解
目录 引言 实例 引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况.在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就是type属性,type表示的是扫描方式,代表 MySQL 使用了哪种索引类型,不同的索引类型的查询效率是不一样的. 在type这一列,有如下一些可能的选项: system:系统表,少量数据,往往不需要进行磁盘IOconst:常量连接eq_ref:主键索引(primary key)或者非空唯一索引(u
-
大幅提升MySQL中InnoDB的全表扫描速度的方法
在 InnoDB中更加快速的全表扫描 一般来讲,大多数应用查询的时候都会用索引,查找很少的几行数据(主键查找或百行内的查询),但有时候我们需要全表查询.典型的全表扫描就是逻辑备份 (mysqldump) 和 online schema changes( 注:在线上对大表 schema 的操作,也是 facebook 的一个开源项目) (SELECT ... INTO OUTFILE). 在 Facebook我们用 mysqldump 来备份数据库. 正如你所知MySql提供两种备份方式,提
-
导致MySQL做全表扫描的几种情况
这两天看到了两种可能会导致全表扫描的sql,这里给大家看一下,希望可以避免踩坑: 情况1: 强制类型转换的情况下,不会使用索引,会走全表扫描. 举例如下: 首先我们创建一个表 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) DEFAULT NULL, `score` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KE
-
MySQL查询优化:LIMIT 1避免全表扫描提高查询效率
在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率. 例如下面的用户表(主键id,邮箱,密码): 复制代码 代码如下: create table t_user( id int primary key auto_increment, email varchar(255), password varchar(255) ); 每个用户的email是唯一的,如果用户使用email作为用户名登陆的话,就需要查询出email对应的一条记录. SELECT * FROM t
-
SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法
复制代码 代码如下: SET @SQL = 'SELECT * FROM Comment with(nolock) WHERE 1=1 And (@ProjectIds Is Null or ProjectId = @ProjectIds) And (@Scores is null or Score =@Scores)' 印象中记得,以前在做Oracle开发时,这种写法是会导致全表扫描的,用不上索引,不知道Sql Server里是否也是一样呢,于是做一个简单的测试1.建立测试用的表结
-
PostgreSQL 禁用全表扫描的实现
PostgreSQL可以通过一些设置来禁用全表扫描(FULL SCAN/Seq Scan) 注意: 设置此功能后不是完全避免全表扫描,而是只要有不通过全表扫描能得出结果的就不走全表扫描. 如果什么路都不通,那肯定得全表扫描,不然怎么获取数据. 而且并不是不走全表扫描性能就一定好. 下面展示下这个功能: 查询表结构: highgo=# \d test Table test Column | Type | Modifiers -------------+-----------------------
-
LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题
如果表中的字段类型为 char(1) 时,Linq to SQL生成char (System.Char)的属性,如下图 表定义 生成的实体 2. 如果要查询LineCode=='A'的记录,可以这样定义Linq查询语句 var test1 = from p in db.ProductLines where p.LineCode =='A' select p; 生成的SQL语句是这样的 SELECT [t0].[LineCode], [t0].[Li
-
MySQL笔记之修改表的实现方法
我们在创建表的过程中难免会考虑不周,因此后期会修改表 修改表需要用到alter table语句 修改表名 复制代码 代码如下: mysql> alter table student rename person;Query OK, 0 rows affected (0.03 sec) 这里的student是原名,person是修改过后的名字 用rename来重命名,也可以使用rename to 还有一种方法是rename table old_name to new_name 修改字段的数据类型 复
-
mysql数据库修改数据表引擎的方法
对于MySQL数据库,如果你要使用事务以及行级锁就必须使用INNODB引擎.如果你要使用全文索引,那必须使用myisam. INNODB的实用性,安全性,稳定性更高但是效率比MYISAM稍差,但是有的功能是MYISAM没有的.修改MySQL的引擎为INNODB,可以使用外键,事务等功能,性能高. 查看数据表的状态 复制代码 代码如下: SHOW TABLE STATUS FROM sites WHERE NAME='site'; SHOW TABLE STATUS FROM db_name W
随机推荐
- angular.js指令中的controller、compile与link函数的不同之处
- [非常感人的]当你嫌弃你的父母时 请你读读这段话
- TortoiseSVN使用方法_动力节点Java学院整理
- IOS HTTP请求的常见状态码总结
- 实例详解JavaScript获取链接参数的方法
- PHP更安全的密码加密机制Bcrypt详解
- 一个鼠标移动滑出层效果的实现代码
- 使用CSS样式position:fixed水平滚动的方法
- 世界上最健康的作息时间表分享
- jquery miniui 教程 表格控件 合并单元格应用
- Android自定义带动画的半圆环型进度效果
- C++ 实例之九宫格广度优先遍历
- 详解Java的线程的优先级以及死锁
- 有道搜索和IP138的IP的API接口(PHP应用)
- Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
- ES6之模版字符串的具体使用
- Javascript格式化并高亮xml字符串的方法及注意事项
- Android使用动画动态添加商品进购物车
- Python使用itertools模块实现排列组合功能示例
- PyCharm在新窗口打开项目的方法