mysql常见问题三

1.mysql常用的优化技巧

1).分析慢查询:mysqldumpslow

开启慢查询日志,在mysql的配置文件my.cn中的mysqld下,添加以下参数:

log-slow-queries = D:/MySQL/log/mysqld-slow-query.log
long-query-time = 5
#log-long-format
#log-slow-admin-statements
log-queries-not-using-indexes

 log-slow-queries:指定慢查询日志文件存放位置,该目录文件一定要有写的权限。可以不用设置,系统会给一个缺省的文件host_name-slow.log

long_query_time:SQL执行时间阈值,默认为1秒。设置long_query_time这个阈值后,mysql数据库会记录运行时间超过该值的所有SQL语句

log-queries-not-using-indexes:如果运行的SQL语句没有使用索引,则mysql数据库同样会将这条SQL语句记录到慢查询日志文件中。

log-long-format:以扩展方式记录有关事件。扩展方式可记录谁发出查询和什么时候发出查询的信息。不建议使用此项。

log-short-format:记录激活的更新日志、二进制更新日志、和慢查询日志的少量信息。例如,用户名和时间戳不记录下来。

查看访问次数最多的 20 个 sql 语句:

mysqldumpslow -s c -t 20 host-slow.log

查看返回记录集最多的 20 个 sql

mysqldumpslow -s r -t 20 host-slow.log 

 按照时间返回前 10 条里面含有左连接的 sql 语句

mysqldumpslow -t 10 -s t -g "left join" host-slow.log

 mysqldumpslow的参数:

-s order:是表示按照何种方式排序,order值有:c、t、l、r 分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒序

-t num,即为返回前面多少条的数据;

-g pattern,pattern可以写一个正则匹配模式,大小写不敏感的;

查看是否开启慢查询:

mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | ON    |

 

2).mysql explain的使用说明
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
使用方法,在select语句前加上explain就可以了:
如:explain select surname,first_name form a,b  where  a.id=b.id
分析结果形式如下:

mysql> explain SELECT * FROM `whisper` WHERE to_id = 6696 AND del =   AND whisper= ORDER BY `send_time` DESC LIMIT 4;
+-+————-+———+——+—————+——-+———+——-+——+—————————–+
| id | select_type | table   | type | possible_keys | key   | key_len | ref   | rows | Extra                       |
+-+————-+———+——+—————+——-+———+——-+——+—————————–+
|  1 | SIMPLE      | whisper | ref  | to_id         | to_id |       4 | const |    1 | Using where; Using filesort |
+-+————-+———+——+—————+——-+———+——-+——+—————————–+

 EXPLAIN列的解释:
table 显示这一行的数据是关于哪张表的
type:  这是重要的列,显示连接使用了何种类型。

从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys: 显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key 实际使用的索引:如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len: 使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref: 显示索引的哪一列被使用了,如果可能的话,是一个常数
rows: MYSQL认为必须检查的用来返回请求数据的行数
Extra 关于MYSQL如何解析查询的额外信息。

将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

extra 列返回的描述的意义
Distinct 一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
Not exists MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
Range checked for each
Record(index map:#)没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
Using filesort 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
Using index 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

不同连接类型的解释(按照效率高低的顺序排序)
system 表只有一行:system表。这是const连接类型的特殊情况
const 表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
eq_ref 在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
ref 这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
range 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
index 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
ALL 这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

3).mysql常用的hint
对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法。同样,在mysql里,也有类似的hint功能。下面介绍一些常用的。
强制索引 FORCE INDEX(FIELD1):以下的SQL语句只使用建立在FIELD1上的索引,而不使用其它字段上的索引。

SELECT * FROM TABLE1 FORCE INDEX (FIELD1) …

 忽略索引 IGNORE INDEX
SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2) …
在上面的SQL语句中,TABLE1表中FIELD1和FIELD2上的索引不被使用。
关闭查询缓冲 SQL_NO_CACHE:

SELECT SQL_NO_CACHE field1, field2 FROM TABLE1;

 有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次),这样就需要把缓冲关了,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。
强制查询缓冲 SQL_CACHE

SELECT SQL_CALHE * FROM TABLE1; 

如果在my.ini中的query_cache_type设成2,这样只有在使用了SQL_CACHE后,才使用查询缓冲。

优先操作 HIGH_PRIORITY
HIGH_PRIORITY可以使用在select和insert操作中,让MYSQL知道,这个操作优先进行。
SELECT HIGH_PRIORITY * FROM TABLE1;
滞后操作 LOW_PRIORITY
LOW_PRIORITY可以使用在insert和update操作中,让mysql知道,这个操作滞后。
update LOW_PRIORITY table1 set field1= where field1= …
延时插入 INSERT DELAYED
INSERT DELAYED INTO table1 set field1= …
INSERT DELAYED INTO,是客户端提交数据给MySQL,MySQL返回OK状态给客户端。而这是并不是已经将数据插入表,而是存储在内存里面等待排队。当mysql有 空余时,再插入。另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。坏处是,不能返回自动递增 的ID,以及系统崩溃时,MySQL还没有来得及插入数据的话,这些数据将会丢失。

强制连接顺序 STRAIGHT_JOIN
SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE …
由上面的SQL语句可知,通过STRAIGHT_JOIN强迫MySQL按TABLE1、TABLE2的顺序连接表。如果你认为按自己的顺序比MySQL推荐的顺序进行连接的效率高的话,就可以通过STRAIGHT_JOIN来确定连接顺序。
强制使用临时表 SQL_BUFFER_RESULT
SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …
当我们查询的结果集中的数据比较多时,可以通过SQL_BUFFER_RESULT.选项强制将结果集放到临时表中,这样就可以很快地释放MySQL的表锁(这样其它的SQL语句就可以对这些记录进行查询了),并且可以长时间地为客户端提供大记录集。
[b]分组使用临时表 SQL_BIG_RESULT和SQL_SMALL_RESULT[/b]
SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1;
一般用于分组或DISTINCT关键字,这个选项通知MySQL,如果有必要,就将查询结果放到临时表中,甚至在临时表中进行排序。SQL_SMALL_RESULT比起SQL_BIG_RESULT差不多,很少使用。

 

4).查询优化:

查询是数据库技术中最常用的操作。查询操作的过程比较简单,首先从客户端发出查询的SQL语句,数据库服务端在接收到由客户端发来的 SQL语句后, 执行这条SQL语句,然后将查询到的结果返回给客户端。虽然过程很简单,但不同的查询方式和数据库设置,对查询的性能将会有很在的影响。
因此,本文就在MySQL中常用的查询优化技术进行讨论。讨论的内容如:通过查询缓冲提高查询速度;MySQL对查询的自动优化;基于索引的排序;不可达查询的检测和使用各种查询选择来提高性能。
一、 通过查询缓冲提高查询速度
一般我们使用SQL语句进行查询时,数据库服务器每次在收到客户端发来SQL后,都会执行这条SQL语句。

但当在一定间隔内(如1分钟内),接到完 全一样的SQL语句,也同样执行它。虽然这样可以保证数据的实时性,但在大多数时候,数据并不要求完全的实时,也就是说可以有一定的延时。如果是这样的 话,在短时间内执行完全一样的SQL就有些得不偿失。
幸好MySQL为我们提供了查询缓冲的功能(只能在MySQL 4..1及以上版本使用查询缓冲)。我们可以通过查询缓冲在一定程度上提高查询性能。
我们可以通过在MySQL安装目录中的my.ini文件设置查询缓冲。

设置查询缓冲:

query_cache_type=1

 在设 置了这个属性后,MySQL在执行任何SELECT语句之前,都会在它的缓冲区中查询是否在相同的SELECT语句被执行过,如果有,并且执行结果没有过 期,那么就直接取查询结果返回给客户端。但在写SQL语句时注意,MySQL的查询缓冲是区分大小写的。如下列的两条SELECT语句:
1.    SELECT * from TABLE1
2.
3.    SELECT * FROM TABLE1
上面的两条SQL语句对于查询缓冲是完全不同的SELECT。

而且查询缓冲并不自动处理空格,因此,在写SQL语句时,应尽量减少空格的使用,尤其是在SQL首和尾的空格(因为,查询缓冲并不自动截取首尾空格)。
虽然不设置查询缓冲,有时可能带来性能上的损失,但有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次)。这样就需要把 缓冲关了。当然,这可以通过设置query_cache_type的值来关闭查询缓冲,但这就将查询缓冲永久地关闭了。

在MySQL 5.中提供了一种可以不查询缓冲的方法:

SELECT SQL_NO_CACHE field1, field2 FROM TABLE1

 以上的SQL语句由于使用了SQL_NO_CACHE,因此,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。
我们还可以将my.ini中的query_cache_type设成2,这样只有在使用了SQL_CACHE后,才使用查询缓冲。

SELECT SQL_CALHE * FROM TABLE1

 二、MySQL对查询的自动优化
索引对于数据库是非常重要的。在查询时可以通过索引来提高性能。但有时使用索引反而会降低性能。我们可以看如下的SALES表:

CREATE TABLE SALES  (
ID INT(1) UNSIGNED NOT NULL AUTO_INCREMENT,
NAME VARCHAR(1) NOT NULL,
PRICE FLOAT NOT NULL,
SALE_COUNT INT NOT NULL,
 SALE_DATE DATE NOT NULLPRIMARY KEY(ID),
INDEX (NAME),
INDEX (SALE_DATE)
);

 假设这个表中保存了数百万条数据,而我们要查询商品号为1的商品在24年和25年的平均价格。我们可以写如下的SQL语句:

SELECT AVG(PRICE) FROM SALES
WHERE ID = 1 AND SALE_DATE BETWEEN24-1-1AND25-12-31′;

 如果这种商品的数量非常多,差不多占了SALES表的记录的5%或更多。那么使用SALE_DATE字段上索引来计算平均数就有些慢。因为如果使 用索引,就得对索引进行排序操作。

当满足条件的记录非常多时(如占整个表的记录的5%或更多的比例),速度会变慢,这样还不如对整个表进行扫描。因 此,MySQL会自动根据满足条件的数据占整个表的数据的比例自动决定是否使用索引进行查询。
对于MySQL来说,上述的查询结果占整个表的记录的比例是3%左右时就不使用索引了,这个比例是MySQL的开发人员根据他们的经验得出的。然而,实际的比例值会根据所使用的数据库引擎不同而不同。
三、 基于索引的排序
MySQL的弱点之一是它的排序。虽然MySQL可以在1秒中查询大约15条记录,但由于MySQL在查询时最多只能使用一个索引。因此,如果WHERE条件已经占用了索引,那么在排序中就不使用索引了,这将大大降低查询的速度。我们可以看看如下的SQL语句:
1.    SELECT * FROM SALES WHERE NAME = “name” ORDER BY SALE_DATE DESC;
在以上的SQL的WHERE子句中已经使用了NAME字段上的索引,因此,在对SALE_DATE进行排序时将不再使用索引。为了解决这个问题,我们可以对SALES表建立复合索引:

ALTER TABLE SALES DROP INDEX NAME, ADD INDEX (NAME, SALE_DATE)

 这样再使用上述的SELECT语句进行查询时速度就会大副提升。但要注意,在使用这个方法时,要确保WHERE子句中没有排序字段,在上例中就是不能用SALE_DATE进行查询,否则虽然排序快了,但是SALE_DATE字段上没有单独的索引,因此查询又会慢下来。
四、 不可达查询的检测
在执行SQL语句时,难免会遇到一些必假的条件。所谓必假的条件是无论表中的数据如何变化,这个条件都为假。如WHERE value < 1 AND value > 2。我们永远无法找到一个既小于1又大于2的数。
如果遇到这样的查询条件,再去执行这样的SQL语句就是多此一举。幸好MySQL可以自动检测这种情况。如我们可以看看如下的SQL语句:
1.    SELECT * FROM SALES WHERE NAME = “name1” AND NAME = “name2”
以上的查询语句要查找NAME既等于name1又等于name2的记录。很明显,这是一个不可达的查询,WHERE条件一定是假。MySQL在执行 SQL语句之前,会先分析WHERE条件是否是不可达的查询,如果是,就不再执行这条SQL语句了。为了验证这一点。我们首先对如下的SQL使用 EXPLAIN进行测试:
1.    EXPLAIN SELECT * FROM SALES WHERE NAME = “name1”
上面的查询是一个正常的查询,我们可以看到使用EXPLAIN返回的执行信息数据中table项是SALES。这说明MySQL对SALES进行操作了。再看看下面的语句:
1.    EXPLAIN SELECT * FROM SALES WHERE NAME = “name1” AND NAME = “name2”
我们可以看到,table项是空,这说明MySQL并没有对SALES表进行操作。
五、 使用各种查询选择来提高性能
SELECT语句除了正常的使用外,MySQL还为我们提供了很多可以增强查询性能的选项。如上面介绍的用于控制查询缓冲的SQL_NO_CACHE和SQL_CACHE就是其中两个选项。在这一部分,我将介绍几个常用的查询选项。
1. STRAIGHT_JOIN:强制连接顺序
当我们将两个或多个表连接起来进行查询时,我们并不用关心MySQL先连哪个表,后连哪个表。而这一切都是由MySQL内部通过一系列的计算、评估,最后得出的一个连接顺序决定的。如下列的SQL语句中,TABLE1和TABLE2并不一定是谁连接谁:
1.    SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 ,TABLE2 WHERE …
如果开发人员需要人为地干预连接的顺序,就得使用STRAIGHT_JOIN关键字,如下列的SQL语句:
1.    SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE …
由上面的SQL语句可知,通过STRAIGHT_JOIN强迫MySQL按TABLE1、TABLE2的顺序连接表。如果你认为按自己的顺序比MySQL推荐的顺序进行连接的效率高的话,就可以通过STRAIGHT_JOIN来确定连接顺序。
2. 干预索引使用,提高性能
在上面已经提到了索引的使用。一般情况下,在查询时MySQL将自己决定是否使用索引,使用哪一个索引。但在一些特殊情况下,我们希望MySQL只使用一个或几个索引,或者不希望使用某个索引。这就需要使用MySQL的控制索引的一些查询选项。
限制使用索引的范围
有时我们在数据表里建立了很多索引,当MySQL对索引进行选择时,这些索引都在考虑的范围内。但有时我们希望MySQL只考虑几个索引,而不是全部的索引,这就需要用到USE INDEX对查询语句进行设置。

SELECT * FROM TABLE1 USE INDEX (FIELD1, FIELD2) …

从以上SQL语句可以看出,无论在TABLE1中已经建立了多少个索引,MySQL在选择索引时,只考虑在FIELD1和FIELD2上建立的索引。
限制不使用索引的范围
如果我们要考虑的索引很多,而不被使用的索引又很少时,可以使用IGNORE INDEX进行反向选取。在上面的例子中是选择被考虑的索引,而使用IGNORE INDEX是选择不被考虑的索引。

SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2) …

 在上面的SQL语句中,TABLE1表中只有FIELD1和FIELD2上的索引不被使用。
强迫使用某一个索引
上面的两个例子都是给MySQL提供一个选择,也就是说MySQL并不一定要使用这些索引。而有时我们希望MySQL必须要使用某一个索引(由于 MySQL在查询时只能使用一个索引,因此只能强迫MySQL使用一个索引)。这就需要使用FORCE INDEX来完成这个功能。

 SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … 

以上的SQL语句只使用建立在FIELD1上的索引,而不使用其它字段上的索引。
3. 使用临时表提供查询性能
当我们查询的结果集中的数据比较多时,可以通过SQL_BUFFER_RESULT.选项强制将结果集放到临时表中,这样就可以很快地释放MySQL的表锁(这样其它的SQL语句就可以对这些记录进行查询了),并且可以长时间地为客户端提供大记录集。

SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE

 和SQL_BUFFER_RESULT选项类似的还有SQL_BIG_RESULT,这个选项一般用于分组或DISTINCT关键字,这个选项通知MySQL,如果有必要,就将查询结果放到临时表中,甚至在临时表中进行排序。
SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1

 

2.mysql数据库索引类型都有哪些?

索引类型: B-TREE索引,哈希索引

B-TREE索引加速了数据访问,因为存储引擎不需要扫描整个表得到需要的数据。

它从根节点开始查找。根节点保存了指向子节点的指针,并且存储引擎会根据指针寻找数据。

它通过查找节点页中的值找到正确的指针,节点页包含子节点的指针,并且存储引擎会根据指针寻找数据。

它通过查找节点页中的值找到正确的指针,节点页包含子节点中值的上界和下界。

最后,存储引擎可能无法找到需要的数据,也可能成功地找到包含数据的叶子页面。

B-TREE索引 对于以下类型查询有用

匹配全名、匹配最左前缀、匹配列前缀、匹配范围值、精确匹配一部分并且匹配某个范围中的另一部分

B-TREE索引的局限:如果查找没有从索引列的最左边开始,它就没什么用处。不能跳过索引中的列,存储引擎不能优先访问任何在第一个范围条件右边的列。

例:如果查询是where last_name=’Smith’ AND first_name LIKE ‘J%’ AND dob=’1976-12-23’;

访问就只能使用索引的头两列,因为LIKE是范围条件。

哈希索引建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。

对于每一行,存储引擎计算出了被索引列的哈希码,它是一个较小的值,并且有可能和其他行的哈希码不同。

它把哈希码保存在索引中,并且保存了一个指向哈希表中每一行的指针。

因为索引只包含了哈希码和行指针,而不是值自身,MYSQL不能使用索引中的值来避免读取行。

MYSQL不能使用哈希索引进行排序,因为它们不会按序保存行。

哈希索引不支持部分键匹配,因为它们是由被索引的全部值计算出来的。

也就是说,如果在(A,B)两列上有索引,并且WHERE子句中只使用了A,那么索引就不会起作用。

哈希索引只支持使用了= IN()和<=>的相等比较。它们不能加快范围查询。

例如WHERE  price > 1;访问哈希索引中的数据非常快,除非碰撞率很高。当发生碰撞的时候,存储引擎必须访问链表中的每一个行指针,然后逐行进行数据比较,以确定正确的数据。

如果有很多碰撞,一些索引维护操作就有可能会变慢。

 

3.什么是聚集索引?

聚集索引:指实际的数据行和相关的键值都保存在一起。

每个表只能有一个聚集索引。但是,覆盖索引可以模拟多个聚集索引。

存储引擎负责实现索引,因此不是所有的存储索引都支持聚集索引。

当前,SolidDB和InnoDB是唯一支持聚集索引的存储引擎。

优点:可以把相关数据保存在一起。这样从磁盘上提取几个页面的数据就能把某个用户的邮件全部抓取出来。如果没有使用聚集,读取每个邮件都会访问磁盘。数据访问快。聚集索引把索引和数据都保存到了同一棵B-TREE中,因此从聚集索引中取得数据通常比在非聚集索引进行查找要快。

缺点:聚集能最大限度地提升I/O密集负载的性能。如果数据能装入内存,那么其顺序也就无所谓了。这样聚集就没有什么用处。插入速度严重依赖于插入顺序。更新聚集索引列是昂贵的,因为强制InnoDB把每个更新的行移到新的位置。建立在聚集索引上的表在插入新行,或者在行的主键被更新,该行必须被移动的时候会进行分页。聚集表可会比全表扫描慢,尤其在表存储得比较稀疏或因为分页而没有顺序存储的时候。第二(非聚集)索引可能会比预想的大,因为它们的叶子节点包含了被引用行的主键列。第二索引访问需要两次索引查找,而不是一次。 InnoDB的第二索引叶子节点包含了主键值作为指向行的“指针”,而不是“行指针”。 这种策略减少了在移动行或数据分页的时候索引的维护工作。使用行的主键值作为指针使得索引变得更大,但是这意味着InnoDB可以移动行,而无须更新指针。

 

4.mysql存储引擎有哪些,如何修改?

MyISAM indexed sequential access method (有索引的顺序访问方法)
MyISAM 具有检查和修复表格的大多数工具。表格可以被压缩,而且支持全文收索
不是事务安全的,而且不支持外键。
MEMORY 也是以前的(HEAP) 该类型表存储在内存中,表的索引是哈希分布的。

merge 这些表为了查询目的,把myisam 表集合作为单个表,因此你可以在某些操作系统中避开最大文件大小的限制。

archive 这种类型的表只支持,insert ,select 不支持delete,update,replace ,不使用索引。

csv 这些表保存在服务器的单个文件中,它包含了用逗号间隔的数据。

innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,比myisam慢。

修改mysql存储引擎

alter table tablename engine = innodb;

 

 

5.mysql记录货币用什么字段类型好

NUMERIC和DECIMAL类型被MySQL实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的值被(并且通常是)指定;例如:

salary DECIMAL(9,2)
9(precision)代表将被用于存储值的总的位数,而2(scale)代表将被用于存储小数点后的位数。因此,在这种情况下,能被存储在salary列中的值的范围是从-9999999.99到9999999.99。

DECIMAL和NUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(如果scale>)和“-”符号(对于负值)。如果scale是,DECIMAL和NUMERIC值不包含小数点或小数部分。

DECIMAL和NUMERIC值得最大的范围与DOUBLE一样,但是对于一个给定的DECIMAL或NUMERIC列,实际的范围可由制由给定列的precision或scale限制。当这样的列赋给了小数点后面的位超过指定scale所允许的位的值,该值根据scale四舍五入。当一个DECIMAL或NUMERIC列被赋给了其大小超过指定(或缺省的)precision和scale隐含的范围的值,MySQL存储表示那个范围的相应的端点值。

 

6.mysql数据表修复

1. MYSQL数据表在什么情况下容易损坏?

  •  服务器突然断电导致数据文件损坏。
  • 强制关机,没有先关闭mysql 服务等。

2. 数据表损坏后的主要现象是什么?

  • 从表中选择数据之时,得到如下错误:Incorrect key file for table: ‘̷’. Try to repair it
  • 查询不能在表中找到行或返回不完全的数据。
  • Error: Table ‘p’ is marked as crashed and should be repaired 。
  • 打开表失败: Can’t open file: ‘×××.MYI’ (errno: 145) 。

3. 数据表损坏的修复方式有哪些?

    • 使用 myisamchk 来修复,具体步骤: 1)修复前将mysql服务停止。 2)打开命令行方式,然后进入到mysql的/bin目录。3)执行myisamchk –recover  数据库所在路径/*.MYI
    • 使用repair table 或者 OPTIMIZE  table命令来修复:REPAIR TABLE `table_name`,用来修复表; OPTIMIZE TABLE `table_name` ,用来优化表。 REPAIR TABLE 用于修复被破坏的表。OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)

在面试MySQL DBA或者那些打算做MySQL性能优化的人时,我最喜欢问题是:MySQL服务器按照默认设置安装完之后,应该做哪些方面的调节呢?

key_buffer_size- 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 3-4%。合理的值取决于索引大小、数据量以及负载 — 记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 — .MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。

innodb_buffer_pool_size- 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 7-8% 的可用内存。一些应用于 key_buffer 的规则有 — 如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大了。

innodb_additional_pool_size- 这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 2MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。

innodb_log_file_size在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。

innodb_log_buffer_size默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。越小的系统它的值越小。

innodb_flush_logs_at_trx_commit是否为Innodb比MyISAM慢1倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置为 就快很多了,不过也相对不安全了 — MySQL服务器崩溃时就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。

table_cache— 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。如果你有2多个表的话,那么设置为 124 也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。我曾经见过设置为 1, 的情况。

thread_cache— 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且Threads_Created的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。

query_cache— 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。

注意:就像你看到的上面这些全局表量,它们都是依据硬件配置以及不同的存储引擎而不同,但是会话变量通常是根据不同的负载来设定的。如果你只有一些简单的查询,那么就无需增加sort_buffer_size的值了,尽管你有 64GB 的内存。搞不好也许会降低性能。我通常在分析系统负载后才来设置会话变量。

MySQL的发行版已经包含了各种 my.cnf 范例文件了,可以作为配置模板使用。通常这比你使用默认设置好的多了。

 

* 想知道一个查询用到了哪个index,如何查看?

* 如何强制mysql 使用某一个index ?

* 一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15

* 一个查询 select * from abc where a = 123 and b = 456 order by c limit 1; 请分析一下如何优化?需要哪些更多的信息?

* 数据库 load 非常高, 现在要添加一个新server来设置成master-slave模式,请问一般的步骤是什么? my.cnf里的相关的设置大概是什么样子(对如何拼写不做要求) ?

* 主从模式出现错误 162,导致数据库不能同步,请问如何修复?

* 数据库不能停机,请问如何备份? 如何进行全备份和增量备份?

* 数据库性能下降,想找到哪些sql耗时较长,应该如何操作? my.cnf里如何配置?

 

 

1 mysql你都修改了那些配置文件来进行优化(问配置文件中具体修改的内容)?
2 数据库用的什么?mysql用了几台?是否做读写分离?主从复制做了读写分离,主挂了或者从挂了你怎么办?
3 mysql出现过什么问题,如何解决的?
4 mysql如何创建一个库,添加一个表,在表中插入数据。
5 mysql做过什么优化
6 以前工作中mysql连接数
7 数据库 怎么备份的
8 oracle怎么调优的
9 你们mysql数据量有多大?
1 你们备份数据是备份在同一设备?
11 你们是用什么备份的
12 MYSQL会什么?会SQL语句么?
13 会MYSQL调优么?
14 mysql是怎么备份的
15 找出当前目录3天之前的文件,并删除
16 主从复制出错怎么解决
17 mysql的配置文件位置
18 ̶mysql 四中操作操作是什么

19 ̶增删改查 你觉得那个最占用资源

2 mysql 简单的 怎么登入 怎么创建数据库bbb 创建 用户 密码 授权
21 mysql数据库同步怎样实现
22 ms25数据库怎样做优化
23 查询mysql数据库中用户,密码,权限的命令
24 mysql会安装么?主从复制会做么?
25 MySQL语句调优会不会?用的什么工具?
26 MySQL索引你会么?平时怎么用的?你是每个表都加上索引么?你怎么确定你加上索引后速度会快?
27 对数据库这方面有没有什么培训打算。
28 oracle日常管理都做哪些
29 oracle加过索引吗
3 b数索引对更新数据有什么影响
31 你们用软件处理过的数据量有多少,处理过上百万的数据吗
32 哦,你们还有转业的dba,你做过什么
33 你迁移多少数据量
34 mysql 数据库的备份与还原 例如一个数据库test
35 mysql都做了哪些,是你自己搭建的么?
36 oracle你都会什么?
37 了解非关系性数据库么
38 Mysql之前用过什么引擎
39 Mysql怎么解决故障切换
4   Mysql都有那几种日志
41 为什么你们用apache不用nginx
42 SQL server的备份与恢复
43 mysql用的是什么?主从?
44 mysql数据库的备份,用的是脚本?
45 mysql 主从数据库的搭建,配置的命令
46 ̶nagios 的搭建,监控的内容,遇到过什么问题?怎么解决的?

47 Oracle启动关闭的命令有哪几种,都代表什么含义
48 Oracle逻辑备份工具是什么
49 写出三种数据库对象
5 数据库死锁概念
51 编译与解释的区别
52 oracle内存空间的特点?
53 写出至少5种Oracle文件类型
54 主从复制在停机和不停机情况下,分别怎么加从服务器
55 Sybase数据库相关的东西很多
56 索引的创建(index)
57 表空间的创建、迁移
58 如何利用存储过程提高数据库读取的性能。
59 选择不同的存储引擎,对数据库的工作有何影响
6 跨库时用存储引擎好不好?为何?
61 nosql的利用价值
62 如何合理分配表空间、创建?
63 数据空间的扩容?
64 对表空间如何监控?
65 把数据分开放在不同的表空间,利与弊?
66 如何实现MySQL服务器的冗余。
67 查看是否安装了mysql
68 启动mysql,进入mysql
69 查看oracle是否运行,有多少个数据库
7 怎么样进入oracle
71 查看oracle的用户
72 oracle的登录方式
73 mysql怎么样,主从复制做过吗,怎样查看复制的状态
74 oracle rac与一般DB的区别?
75 数据库有几种数据保护方式(AAA)
76 session是否被锁怎么看,写出查询与处理过程
77 rman还原的几种方式(优劣)
78 rac切换所有主机日志的命令
79 oracle数据查询如何做到一致
8 sql查询语句
81 mysql主从复制怎么做的
82 mysql备份时备份主的还是备份从的?
83 ̶基于数据库中的成绩表
成绩(学号,课程名,成绩)
用SQL语句创建成绩表,并往成绩表中插入一个元组(2111,管理信息系统,8)

84
85 mysql安装的时候自己选择路径怎么做?
86 mysql语句你熟么
87 如果一个表被drop,在有完善的归档和备份情况下,如何恢复
88 .对于一个恢复时间比较短的系统(数据库5G,每天归档5G),你如何设计备份策略
89 mysql 存储方式?
9 简述MSMQ消息队列的作用及工作原理。
91 说说你用的数据库及区别
92 oracle数据库要多看
93 备份 存储过程
94 有oracle里面的sql语句问题;查找、按条件显示等
95 mysql出过什么故障?
96 oracle接触过么
97 怎样修改mysql表中的信息
98 mysql主从能一个人完成吗,怎么指定主的服务器
99 什么时候恢复数据库?
1 怎么恢复?
11 为什么要备份数据库?
12 备份的周期?
13 系统调优都做哪些?
14 如何删除?
15 mysql远程备份
16 mysql熟悉吗?
17 备份怎么做?
18 你怎么给mysql备份
19 会使用sqlserver么
11 mysql怎么备份
111 mysql同步有几个进程
112 怎么做的mysql数据库备份
113 如果数据库中有一个表的数据量很大,无法用rm删除,该怎么办
114 MYSQL用得怎么样
115 对oracle都做过哪些操作
116 让我进入mysql的目录,他告诉我了路径
117 问我mysqldump是什么意思,mysqld和mysqld_safe什么区别
118 然后问mysql这个命令跟mysqld有什么区别么
119 之后让我打开mysql的配置文件my.cnf问了里面一个参数是什么意思
12 mysql怎么做的备份
121 mysql做的是主从吗
122 主用的是什么引擎
123 主从都用的是innoDB吗
124 innoDB和myisam有什么区别
125 mysql的备份命令是什么
126 在mysql服务器运行缓慢的情况下输入什么命令能缓解服务器压力
127 怎么导出表结构?
128 Oracle的几种模式?
129 oracle的报警日志文件路径?
13 几种关闭数据库方法?参数?区别?
131 会写 Ksh csh 吗?
132 精通oracle吗?
133 会写存储过程吗?
134 oracle的rman怎么用?
135 上一家公司主要是做什么的?你负责哪一块
136 mysql的优化会吗?是怎么做的?
137 搭建过oracle的集群吗?
138 nginx用过吗?做什么用的?测试时最大的负载是多少?
139 正常登入MYSQL后使用什么命令查看其进程是否正常,和变量
14 查看命令的使用方法
141 每小时的,24,4分钟 执行/home/sh 用crontab
142 怎样重新启动named
143 linux 中查找文件最快的命令是什么
144 linux mysql 重设root密码
145 mysql远程连接命令
146 mysql主从用什么方式传输日志
147 介绍一下mysql
148 mysql、oracle、sqlserver的默认端口是
149 数据库的备份方式
15 mysql用户test 只能由abc.com访问test表且test只能访问test密码testpasswd
151 介绍一下mysql
152 介绍下mysql的管理,备份,主备
153 mysql主从数据不同步如何解决
154 mysql主从做过切换吗?当主的失效,从的自动切换成主?
155 oracle管理过吗?
156 给mysql创建个用户,并对表test有访问权限
157 mysql备份,备份某个库中的某个表
158 查看mysql数据库是否支持innodb
159 如何在mysql某个表中随机抽取1条记录
16 如何查看连接mysql的当前用户
161 书写出mysql常用的命令,以及备份命令
162 写出mysql怎么修改密码?怎么修复损坏的表?
163 mysql用户test 只能由abc.com访问test表且test只能访问test密码testpasswd
164 mysql的备份,数据的导入
165 oracle数据库的安装过程
166 oracle中创建数据库
167 用oracle用户test登录数据库,密码test
168 创建oracle表空间
169 ls,rm,man,vi的含义与作用
17 mysql数据库中多个表结合查询
171 在系统中有个sql文件,怎么在数据库中执行sql文件中的命令
172 mysql的ab复制的原理
173 mysql主从复制数据丢失怎么知道的
174 mysql优化
175 mysql备份流程
176 mysql主从原理
177 书写出mysql常用的命令,以及备份命令
178 写出mysql怎么修改密码?怎么修复损坏的表?
179 Oracle用什么备份
18 都使用过什么数据库?Oracle、mysql?Mysql主从压力大的时候,怎么在不影响业务的前提下,在加入一台mysql
181 mysql数据库用的多吗
182 mysql复制
183 oracle dataguard

 

posted on 2018-10-10 16:06  myworldworld  阅读(384)  评论(0)    收藏  举报

导航