- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL数据库优化技术之索引使用技巧总结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例总结了MySQL数据库优化技术的索引用法。分享给大家供大家参考,具体如下:
这里紧接上一篇《MySQL数据库优化技术之配置技巧总结》,进一步分析索引优化的技巧:
(七)表的优化 。
1. 选择合适的数据引擎 。
MyISAM:适用于大量的读操作的表 。
InnoDB:适用于大量的写读作的表 。
2.选择合适的列类型 。
使用 SELECT * FROM TB_TEST PROCEDURE ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议 。
3.对于不保存NULL值的列使用NOT NULL,这对你想索引的列尤其重要 。
4.建立合适的索引 。
5.使用定长字段,速度比变长要快 。
(八)建立索引原则 。
1.合理使用索引 。
一个Table在一次query中只能使用一个索引,使用EXPLAIN语句来检验优化程序的操作情况 。
使用analyze帮助优化程序对索引的使用效果做出更准确的预测 。
2.索引应该创建在搜索、排序、归组等操作所涉及的数据列上 。
3.尽量将索引建立在重复数据少的数据列中,唯一所以最好 。
例如:生日列,可以建立索引,但性别列不要建立索引 。
4.尽量对比较短的值进行索引 。
降低磁盘IO操作,索引缓冲区中可以容纳更多的键值,提高命中率 。
如果对一个长的字符串建立索引,可以指定一个前缀长度 。
5.合理使用多列索引 。
如果多个条件经常需要组合起来查询,则要使用多列索引(因为一个表一次查询只能使用一个索引,建立多个单列索引也只能使用一个) 。
6.充分利用最左前缀 。
也就是要合理安排多列索引中各列的顺序,将最常用的排在前面 。
7.不要建立过多的索引 。
只有经常应用于where,order by,group by中的字段需要建立索引. 。
8.利用慢查询日志查找出慢查询(log-slow-queries, long_query_time) 。
(九)充分利用索引 。
1.尽量比较数据类型相同的数据列 。
2.尽可能地让索引列在比较表达式中独立, WHERE mycol < 4 / 2 使用索引,而WHERE mycol * 2 < 4不使用 。
3.尽可能不对查询字段加函数.
如:WHERE YEAR(date_col) < 1990改造成WHERE date_col < '1990-01-01' 。
WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) < cutoff 改造成WHERE date_col < DATE_ADD(CURDATE(), INTERVAL cutoff DAY) 。
4.在LIKE模式的开头不要使用通配符 。
5.使用straight join可以强制优化器按照FROM子句的次序来进行联结,可以select straight join,强制所有联结,也可以select * from a straight join b强制两个表的顺序. 。
6.使用force index强制使用指定的索引.如 select * from song_lib force index(song_name) order by song_name比不用force index效率高 。
7.尽量避免使用MySQL自动类型转换,否则将不能使用索引.如将int型的num_col用where num_col='5' 。
(十)SQL语句的优化 。
1.创建合适的统计中间结果表,降低从大表查询数据的几率 。
2.尽量避免使用子查询,而改用连接的方式.例如:
1
2
|
SELECT
a.id, (
SELECT
MAX
(created)
FROM
posts
WHERE
author_id = a.id)
AS
latest_post
FROM
authors a
|
可以改成:
1
2
3
4
|
SELECT
a.id,
MAX
(p.created)
AS
latest_post
FROM
authors
AS
a
INNER
JOIN
posts p
ON
(a.id = p.author_id)
GROUP
BY
a.id
|
1
2
3
4
|
select
song_id
from
song_lib
where
singer_id
in
(
select
singer_id
from
singer_lib
where
first_char=
'A'
) limit 2000
|
改成
1
2
|
select
song_id
from
song_lib a
inner
join
singer_lib b
on
a.singer_id=b.singer_id
and
first_char=
'A'
limit 2000
|
3.插入判断重复键时,使用ON DUPLICATE KEY UPDATE
。
4.避免使用游标 。
游标的运行效率极低,可以通过增加临时表,运用多表查询,多表更新等方式完成任务,不要使用游标. 。
(十一)使用Explain分析SQL语句使用索引的情况 。
当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息,借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT,你也能知道优化器是否以一个最佳次序联结表。为了强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。 .
EXPLAIN命令的一般语法是:EXPLAIN <SQL命令> 如:explain select * from a inner join b on a.id=b.id 。
EXPLAIN的分析结果参数详解
1.table:这是表的名字.
2.type:连接操作的类型.
system:表中仅有一条记录(实际应用很少只有一条资料的表) 。
const:表最多有一个匹配行,用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时.
如:
1
|
select
*
from
song_lib
where
song_id=2
|
(song_id为表的primary key) 。
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARY KEY的索引读取一行.
如:
(b的type值为eq_ref) 。
。
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARY KEY的索引读取一行 。
如:
和 。
(b的type值为ref,因为b.singer_name是普通索引) 。
。
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行.
如:
。
index_merge:该联接类型表示使用了索引合并优化方法 。
Key: 它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引.
key_len: 索引中被使用部分的长度,以字节计.
3.ref:ref列显示使用哪个列或常数与key一起从表中选择行 。
4.rows: MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1.
5.Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。一般有:
using where:表示使用了where条件 。
using filesort: 表示使用了文件排序,也就是使用了order by子句,并且没有用到order by 里字段的索引,从而需要额外的排序开销,所以如果出现using filesort就表示排序的效率很低,需要进行优化,比如采用强制索引的方法(force index) 。
希望本文所述对大家MySQL数据库计有所帮助.
最后此篇关于MySQL数据库优化技术之索引使用技巧总结的文章就讲到这里了,如果你想了解更多关于MySQL数据库优化技术之索引使用技巧总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!