mysql创建索引

MySQL 查询优化器(二)

谁都会走 提交于 2020-04-07 05:36:48
1.6多个查询字段(常量条件) 多个查询字段的查询处理逻辑如下所示: JOIN:prepare阶段 setup_tables():同1.1测试。 setup_fields():同1.1测试。 setup_conds():同1.4测试。 JOIN:optimize阶段 optimize_cond():类似1.4测试,不同之处在于查询的where条件中有恒等常量,在优化过程中会调用remove_eq_conds将1=1条件删除。 make_join_statistics():与1.4测试类似,由于where条件查询有两个,并且其中一个条件可以通过索引查询。因此首先通过调用update_ref_and_keys()(sql\sql_select.cc:3967)函数,查找可以使用索引的字段。 SQL_SELECT::test_quick_select():同1.5索引测试 get_key_scans_params():同1.5索引测试。 choose_plan():同1.3测试。 greedy_search():同1.3测试。 best_extension_by_limited_search():同1.5索引测试。 JOIN:exec阶段 以下操作同1.3测试。 通过测试可以看出,对于常量等式对查询优化器来说没有任何意义,会在optimize_conds时将常量等式删除

MYSQL杂记

最后都变了- 提交于 2020-04-06 08:28:07
数据库范式:1234 表中不能有重复字段,且字段不能拆分 DDL数据定义语言 DML DCL INNODB,mysam:mysql常用的表类型 mysql默认端口3306 mysql分为客户端和服务器,只有服务器端开启以后,客户端才可以使用服务。安装时选择自动启动服务时,每次开机都会自动启用mysql服务。手动启动方式:控制面板--性能与维护--管理工具--服务--MySQL--启动(或右击设置) 服务启动后可以通过客户端登陆。 (1)DOS界面客户端登陆 mysql -h localhost -u root -p ;或\g来结束命令 exit退出 (2)运行中直接输入mysql -h localhost -u root -p或者mysql -h 127.0.0.1 -u root -p (3)开始菜单中找到mysql command line client mysql需要配置path变量(bin文件夹的路径) mysql配置:(1)开始菜单中MYSQL选项中有配置选项,选重新配置 (2)修改配置文件:安装目录下 bin文件下为常用命令可执行文件;lib为库文件;share为字符集信息;my.ini为配置文件;其他.ini为配置文件模板。datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL

浅说MySQL优化方法

柔情痞子 提交于 2020-04-05 19:05:07
1.优化思路 在数据库的优化上我们有两个方面,一方面是安全,另一方面则是性能. 安全 ,就是要保证数据的可持续性; 性能,则说的就是数据的高性能访问; 2.优化方法 1)选取最适用的字段属性 一般来说,数据库中的表越小,查询执行的效率越快,因此我们可以在创建表的时候将字段竟可能设定的小一点,这样增加了数据库的空间. 另一个方法则是在可能的情况下,尽量把字段设置为非空,这样查询的时候就不用去比较NULL值,从而提升查询速度 2)使用连接查询代替子查询 使用子查询的话数据库需要在内存中先创建出临时表,然后再把临时表用在另一个查询上,子查询可以一次性完成很多逻辑上多个步骤才能完成的SQL操作,这样查询速度不是很快,而采用连接查询的话,MYSQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作. 3)使用联合来代替手动创建的临时表 使用UNION查询,可以把 需要使用临时表的两条或更多的 SELECT 查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用 UNION 来创建查询的时候,我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了, 要注意的是所有 SELECT 语句中的字段数目要想同 . SELECT * FROM t_address UNION SELECT * FROM t_area; 4

SQL优化

℡╲_俬逩灬. 提交于 2020-04-05 18:04:59
SQL优化 1.原因 需要SQL优化的原因有:   一、SQL语句性能低下   二、执行时间过长   三、等待时间过长   四、SQL语句欠佳(多数出现在连接查询时)   五、索引失效   六、服务器参数设置不合理(例如:缓冲区、线程数) SQL:   编写过程:     select...dinstinct ...from...join...on...where...group by...having...order by...limit   解析顺序:     from...on...join...where...group by...having...select... dinstinct ...order by...limit 详细信息可参照: https://www.cnblogs.com/annsshadow/p/5037667.html SQL优化,主要就是在优化索引   索引作用:相当于书的目录   索引:index 是帮助mysql高效获取数据的数据结构。索引是数据结构 组成(树:B+树,Hash树) B+树数据结构图: B树不光有上边的二叉树,也可以有三叉乃至多叉树: B+三叉树图: 索引弊端: 索引的弊端: 1.索引本身很大, 可以存放在内存/硬盘(通常为 硬盘) 2.索引不是所有情况均适用: a.少量数据 b.频繁更新的字段 c.很少使用的字段 3

MySQL优化

假装没事ソ 提交于 2020-04-05 17:41:05
一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式 key_len列,索引长度 rows列,扫描行数。该值是个预估值 extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary 二、SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。 三、SELECT语句务必指明字段名称 SELECT *增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。 四、当只需要一条数据的时候,使用limit 1 这是为了使EXPLAIN中type列达到const类型 五

MySQL count知多少

旧巷老猫 提交于 2020-04-05 16:51:11
统计一个表的数据量是经常遇到的需求,但是不同的表设计及不同的写法,统计性能差别会有较大的差异,下面就简单通过实验进行测试( 大家测试的时候注意缓存的情况,否则影响测试结果 )。 1、 准备工作 为了后续测试工作的进行,先准备几张用于测试的表及数据,为了使测试数据具有参考意义,建议测试表的数据量大一点,以免查询时间太小,因此,可以继续使用之前常用的连续数生成大法,如下: /* 创建连续数表 */ CREATE TABLE nums(id INT primary key); /* 生成连续数的存储过程,优化过后的 */ DELIMITER $$ CREATE PROCEDURE `sp_createNum`(cnt INT ) BEGIN DECLARE i INT DEFAULT 1; TRUNCATE TABLE nums; INSERT INTO nums SELECT i; WHILE i < cnt DO BEGIN INSERT INTO nums SELECT id + i FROM nums WHERE id + i<=cnt; SET i = i*2; END; END WHILE; END$$ DELIMITER ; 生成数据,本次准备生成1kw条记录 /* 调用存储过程 */ mysql> call sp_createNum(10000000); Query OK

全文索引xunsearch的详细讲解及sphinx的比较

时间秒杀一切 提交于 2020-04-04 06:45:36
一、获取: xunsearch下载地址: http://www.xunsearch.com/site/download。 linux命令行下载:wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 解压:tar -xjf xunsearch-full-latest.tar.bz2 二、安装: 根据提示进行操作,输入 xunsearch 软件包的安装目录,这里最好把xunsearch单独放在一个目录下。 cd xunsearch-full/ sh setup.sh 三、启动 启动/重新启动 xunsearch 的后台服务$prefix 替换为你的xunsearch安装目录 cd $prefix; bin/xs-ctl.sh restart 添加到开机启动脚本,在 Linux 系统中将脚本指令$prefix/bin/xs-ctl.sh restart写进 /etc/rc.local 即可 四、xunsearch项目配置文件详解 项目名称 project.name = AppName 默认字符集 project.default_charset = UTF-8 定义字段[field_name] type 字段类型 string 字符型,适用多数情况,也是默认值 numeric 数值型,包含整型和浮点数

Sphinx以及coreseek的安装及使用 .No1

和自甴很熟 提交于 2020-04-04 06:39:31
检索结构 php -> sphinx -> mysql 非结构化数据又叫全文数据,非固定长度字段例如文章标题搜索这类适用sphinx 全文数据搜索: 顺序扫描 : 如like查找 索引扫描 : 把非结构化数据中的内容提取出来一部分重新组织,这部分数据就叫做索引 全文检索分为两个过程 1.创建索引 2.搜索索引 创建索引: sphinx通过语言处理组件会把搜索语句中的标点符号,语气助词给过滤掉,然后处理完毕后会 分析出一些词语,传给索引组件,然后排序去除重复词语. 搜索索引: 搜索关键字 提交 -> sphinx 分析出文档ID -> mysql通过ID查询数据并返回 中文分词需要coreseek coreseek 支持中文的全文检索引擎 sphinx的安装 下载源码包 进行源码安装 ./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql make && make install sphinx 中重要的三个命令(bin目录下) Indexer 创建索引命令 Searchd 启动进程命令 Search 命令行搜索命令 配置sphinx cd /usr/local/sphinx/etc cp sphinx.conf.dist sphinx.conf vi sphinx.conf 配置文件

MySQL 21道高频面试题及其解析

人盡茶涼 提交于 2020-04-03 23:52:04
Q1:MySQL主要有哪些存储引擎,分别适合哪些应用场景? 答:主要有①MyISAM,是5.5版本之前的默认存储引擎,支持表级锁,不支持事务和外键,并发效率较低,读取数据快,更新数据慢。适合以读操作为主,并且对并发性要求较低的应用。②InnoDB,MySQL目前的默认存储引擎,支持行级锁、事务和外键,并发效率好。适合对事务的完整性和并发性、数据的准确性要求比较高,增删操作多的应用。③Memory,所有的数据都保存在内存中,访问速度快,一旦服务关闭数据将丢失。适合更新不太频繁的数据量小的表用来快速得到访问结果。④Archive、Federated等。 Q2:索引是什么? 答:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 Q3:索引的优缺点有哪些? 答:①优势:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。②劣势:实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE

sql语句性能优化

社会主义新天地 提交于 2020-04-03 21:37:55
面试的时候被面试官问到sql语句的性能优化,回来百度才发现我了解的那些真的是凤毛麟角,废话不多说,上干货: 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’ 或者select id from t