日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

数据库——索引

發(fā)布時(shí)間:2024/1/17 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库——索引 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、索引

  索引是表的目錄,在查找內(nèi)容之前可以先在目錄中查找索引位置,以此快速定位查詢(xún)數(shù)據(jù)。對(duì)于索引,會(huì)保存在額外的文件中。

2、索引種類(lèi)

  • 普通索引:僅加速查詢(xún)
  • 唯一索引:加速查詢(xún) + 列值唯一(可以有null)
  • 主鍵索引:加速查詢(xún) + 列值唯一 + 表中只有一個(gè)(不可以有null)
  • 組合索引:多列值組成一個(gè)索引,
    ? ? ? ? ? ? ? 專(zhuān)門(mén)用于組合搜索,其效率大于索引合并
  • 全文索引:對(duì)文本的內(nèi)容進(jìn)行分詞,進(jìn)行搜索?

索引合并,使用多個(gè)單列索引組合搜索
覆蓋索引,select的數(shù)據(jù)列只用從索引中就能夠取得,不必讀取數(shù)據(jù)行,換句話(huà)說(shuō)查詢(xún)列要被所建的索引覆蓋

3、相關(guān)命令

- 查看表結(jié)構(gòu)desc 表名- 查看生成表的SQLshow create table 表名- 查看索引show index from 表名- 查看執(zhí)行時(shí)間set profiling = 1;SQL...show profiles;

4、使用索引和不使用索引

由于索引是專(zhuān)門(mén)用于加速搜索而生,所以加上索引之后,查詢(xún)效率會(huì)快到飛起來(lái)。# 有索引mysql> select * from tb1 where name = 'wupeiqi-888';+-----+-------------+---------------------+----------------------------------+---------------------+| nid | name | email | radom | ctime |+-----+-------------+---------------------+----------------------------------+---------------------+| 889 | wupeiqi-888 | wupeiqi888@live.com | 5312269e76a16a90b8a8301d5314204b | 2016-08-03 09:33:35 |+-----+-------------+---------------------+----------------------------------+---------------------+1 row in set (0.00 sec)# 無(wú)索引mysql> select * from tb1 where email = 'wupeiqi888@live.com';+-----+-------------+---------------------+----------------------------------+---------------------+| nid | name | email | radom | ctime |+-----+-------------+---------------------+----------------------------------+---------------------+| 889 | wupeiqi-888 | wupeiqi888@live.com | 5312269e76a16a90b8a8301d5314204b | 2016-08-03 09:33:35 |+-----+-------------+---------------------+----------------------------------+---------------------+1 row in set (1.23 sec)

5、正確使用索引

數(shù)據(jù)庫(kù)表中添加索引后確實(shí)會(huì)讓查詢(xún)速度起飛,但前提必須是正確的使用索引來(lái)查詢(xún),如果以錯(cuò)誤的方式使用,則即使建立索引也會(huì)不奏效。
即使建立索引,索引也不會(huì)生效:

- like '%xx'select * from tb1 where name like '%cn';- 使用函數(shù)select * from tb1 where reverse(name) = 'wupeiqi';- orselect * from tb1 where nid = 1 or email = 'seven@live.com';特別的:當(dāng)or條件中有未建立索引的列才失效,以下會(huì)走索引select * from tb1 where nid = 1 or name = 'seven';select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'- 類(lèi)型不一致如果列是字符串類(lèi)型,傳入條件是必須用引號(hào)引起來(lái),不然...select * from tb1 where name = 999;- !=select * from tb1 where name != 'alex'特別的:如果是主鍵,則還是會(huì)走索引select * from tb1 where nid != 123- >select * from tb1 where name > 'alex'特別的:如果是主鍵或索引是整數(shù)類(lèi)型,則還是會(huì)走索引select * from tb1 where nid > 123select * from tb1 where num > 123- order byselect email from tb1 order by name desc;當(dāng)根據(jù)索引排序時(shí)候,選擇的映射如果不是索引,則不走索引特別的:如果對(duì)主鍵排序,則還是走索引:select * from tb1 order by nid desc;- 組合索引最左前綴如果組合索引為:(name,email)name and email -- 使用索引name -- 使用索引email -- 不使用索引

6、其他注意事項(xiàng)

- 避免使用select *- count(1)或count(列) 代替 count(*)- 創(chuàng)建表時(shí)盡量時(shí) char 代替 varchar- 表的字段順序固定長(zhǎng)度的字段優(yōu)先- 組合索引代替多個(gè)單列索引(經(jīng)常使用多個(gè)條件查詢(xún)時(shí))- 盡量使用短索引- 使用連接(JOIN)來(lái)代替子查詢(xún)(Sub-Queries)- 連表時(shí)注意條件類(lèi)型需一致- 索引散列值(重復(fù)少)不適合建索引,例:性別不適合

7、limit分頁(yè)

無(wú)論是否有索引,limit分頁(yè)是一個(gè)值得關(guān)注的問(wèn)題

每頁(yè)顯示10條: 當(dāng)前 118 120125倒序:大 小980 970 7 6 6 5 54 43 3221 19 98 下一頁(yè):select * from tb1 where nid < (select nid from (select nid from tb1 where nid < 當(dāng)前頁(yè)最小值 order by nid desc limit 每頁(yè)數(shù)據(jù) *【頁(yè)碼-當(dāng)前頁(yè)】) A order by A.nid asc limit 1) order by nid desc limit 10;select * from tb1 where nid < (select nid from (select nid from tb1 where nid < 970 order by nid desc limit 40) A order by A.nid asc limit 1) order by nid desc limit 10;上一頁(yè):select * from tb1 where nid < (select nid from (select nid from tb1 where nid > 當(dāng)前頁(yè)最大值 order by nid asc limit 每頁(yè)數(shù)據(jù) *【當(dāng)前頁(yè)-頁(yè)碼】) A order by A.nid asc limit 1) order by nid desc limit 10;select * from tb1 where nid < (select nid from (select nid from tb1 where nid > 980 order by nid asc limit 20) A order by A.nid desc limit 1) order by nid desc limit 10; View Code

8、執(zhí)行計(jì)劃

explain + 查詢(xún)SQL - 用于顯示SQL執(zhí)行信息參數(shù),根據(jù)參考信息可以進(jìn)行SQL優(yōu)化

mysql> explain select * from tb2; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | tb2 | ALL | NULL | NULL | NULL | NULL | 2 | NULL | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ 1 row in set (0.00 sec) id查詢(xún)順序標(biāo)識(shí)如:mysql> explain select * from (select nid,name from tb1 where nid < 10) as B;+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 9 | NULL || 2 | DERIVED | tb1 | range | PRIMARY | PRIMARY | 8 | NULL | 9 | Using where |+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+ 特別的:如果使用union連接氣值可能為nullselect_type查詢(xún)類(lèi)型SIMPLE 簡(jiǎn)單查詢(xún)PRIMARY 最外層查詢(xún)SUBQUERY 映射為子查詢(xún)DERIVED 子查詢(xún)UNION 聯(lián)合UNION RESULT 使用聯(lián)合的結(jié)果...table正在訪問(wèn)的表名type查詢(xún)時(shí)的訪問(wèn)方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/constALL 全表掃描,對(duì)于數(shù)據(jù)表從頭到尾找一遍select * from tb1;特別的:如果有l(wèi)imit限制,則找到之后就不在繼續(xù)向下掃描select * from tb1 where email = 'seven@live.com'select * from tb1 where email = 'seven@live.com' limit 1;雖然上述兩個(gè)語(yǔ)句都會(huì)進(jìn)行全表掃描,第二句使用了limit,則找到一個(gè)后就不再繼續(xù)掃描。INDEX 全索引掃描,對(duì)索引從頭到尾找一遍select nid from tb1;RANGE 對(duì)索引列進(jìn)行范圍查找select * from tb1 where name < 'alex';PS:between andin> >= < <= 操作注意:!=> 符號(hào)INDEX_MERGE 合并索引,使用多個(gè)單列索引搜索select * from tb1 where name = 'alex' or nid in (11,22,33);REF 根據(jù)索引查找一個(gè)或多個(gè)值select * from tb1 where name = 'seven';EQ_REF 連接時(shí)使用primary key 或 unique類(lèi)型select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;CONST 常量表最多有一個(gè)匹配行,因?yàn)閮H有一行,在這行的列值可被優(yōu)化器剩余部分認(rèn)為是常數(shù),const表很快,因?yàn)樗鼈冎蛔x取一次。select nid from tb1 where nid = 2 ;SYSTEM 系統(tǒng)表僅有一行(=系統(tǒng)表)。這是const聯(lián)接類(lèi)型的一個(gè)特例。select * from (select nid from tb1 where nid = 1) as A;possible_keys可能使用的索引key真實(shí)使用的key_lenMySQL中使用索引字節(jié)長(zhǎng)度rowsmysql估計(jì)為了找到所需的行而要讀取的行數(shù) ------ 只是預(yù)估值 extra該列包含MySQL解決查詢(xún)的詳細(xì)信息“Using index”此值表示mysql將使用覆蓋索引,以避免訪問(wèn)表。不要把覆蓋索引和index訪問(wèn)類(lèi)型弄混了。“Using where”這意味著mysql服務(wù)器將在存儲(chǔ)引擎檢索行后再進(jìn)行過(guò)濾,許多where條件里涉及索引中的列,當(dāng)(并且如果)它讀取索引時(shí),就能被存儲(chǔ)引擎檢驗(yàn),因此不是所有帶where子句的查詢(xún)都會(huì)顯示“Using where”。有時(shí)“Using where”的出現(xiàn)就是一個(gè)暗示:查詢(xún)可受益于不同的索引。“Using temporary”這意味著mysql在對(duì)查詢(xún)結(jié)果排序時(shí)會(huì)使用一個(gè)臨時(shí)表。“Using filesort”這意味著mysql會(huì)對(duì)結(jié)果使用一個(gè)外部索引排序,而不是按索引次序從表里讀取行。mysql有兩種文件排序算法,這兩種排序方式都可以在內(nèi)存或者磁盤(pán)上完成,explain不會(huì)告訴你mysql將使用哪一種文件排序,也不會(huì)告訴你排序會(huì)在內(nèi)存里還是磁盤(pán)上完成。“Range checked for each record(index map: N)”這個(gè)意味著沒(méi)有好用的索引,新的索引將在聯(lián)接的每一行上重新估算,N是顯示在possible_keys列中索引的位圖,并且是冗余的。 詳細(xì)

更多參見(jiàn):
  http://www.cnblogs.com/xiaoboluo768/p/5400990.html
  http://dev.mysql.com/doc/refman/5.7/en/explain-output.html#jointype_system

9、慢日志查詢(xún)

a、配置MySQL自動(dòng)記錄慢日志

slow_query_log = OFF ? ? ? ? ? ? ? ? ? ? ? ? ? ?是否開(kāi)啟慢日志記錄
long_query_time = 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?時(shí)間限制,超過(guò)此時(shí)間,則記錄
slow_query_log_file = /usr/slow.log ? ? ? ?日志文件
log_queries_not_using_indexes = OFF ? ? 為使用索引的搜索是否記錄

注:查看當(dāng)前配置信息:
   ? ? show variables like '%query%'
? ? ?修改當(dāng)前配置:
    set global 變量名 = 值

b、查看MySQL慢日志

mysqldumpslow -s at -a ?/usr/local/var/mysql/MacBook-Pro-3-slow.log

""" --verbose 版本 --debug 調(diào)試 --help 幫助-v 版本 -d 調(diào)試模式 -s ORDER 排序方式what to sort by (al, at, ar, c, l, r, t), 'at' is defaultal: average lock timear: average rows sentat: average query timec: countl: lock timer: rows sentt: query time -r 反轉(zhuǎn)順序,默認(rèn)文件倒序拍。reverse the sort order (largest last instead of first) -t NUM 顯示前N條just show the top n queries -a 不要將SQL中數(shù)字轉(zhuǎn)換成N,字符串轉(zhuǎn)換成S。don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN 正則匹配;grep: only consider stmts that include this string -h HOSTNAME mysql機(jī)器名或者IP;hostname of db server for *-slow.log filename (can be wildcard),default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l 總時(shí)間中不減去鎖定時(shí)間;don't subtract lock time from total time """

  

?

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/hedeyong/p/8005658.html

總結(jié)

以上是生活随笔為你收集整理的数据库——索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。