最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單了解django索引的相關知識

 更新時間:2019年07月17日 15:17:53   作者:喝完這杯還有一箱  
這篇文章主要介紹了簡單了解django索引的相關知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

由于數據庫每天都用來存儲越來越多的信息,因此這些也是每個Django項目中的關鍵組件。 因此了解它們的工作方式非常重要。

當然,我無法解釋所有可用于Django的不同數據庫的全部細節(jié)。 不僅如此,因為我不知道這一切,但也因為這會造成一場談話。 或者可能是整個會議。

關于數據庫的理論背景我唯一想說的是,有一種叫做“關系代數”的東西。 用你可能想出的每 一條SELECT語句都可以表達出來。 數學證明。

數據庫查找如何工作

相反,讓我們從數據庫查找的工作方式開始。 因為那是我們最多的時間。

假設我們有這個數據庫的人名表及其相應的年齡,當他們開始編程時。

現在我們要選擇每個19歲開始的人。

我們可以用SQL查詢來表達:

SELECT * FROM people WHERE age = 19

現在,我們如何找到每個人匹配該查詢?

表掃描查找

那么,這很容易。 我們只查看表中的每一行,檢查條件是否適用,如果是,則返回該行。

這被稱為“全表掃描”

到現在為止還挺好。 我們在這里有7排。 因此我們看7行。 這是少量的行,所以查詢速度很快。

但是想象一下,你有10萬,1億,100億甚至更多的行。 遍歷每一行可能非常耗時。 這不是我們想要的或我們可以負擔得起的東西。 我們希望能夠提供有保證的時機來查找特定行。 與行數無關。

這是索引加入派對的地方。

什么是索引?

對于數量不斷增加的數據,索引可以快速訪問單個(或多個)項目,而不會減少很多速度。 這也被稱為“隨機訪問”。 你會看到為什么這樣叫。 但首先讓我們看看現代數據庫系統中最常見的索引類型。

B-Trees / B +樹

目前最常見的索引是B-Tree索引。 或者更確切地說,B +樹索引。

它們或者以其發(fā)明者之一Rudolf Bayer命名,或者因為他們自我平衡。 這不是很清楚,但也并不重要。 自我平衡意味著樹木有一定的時間保證:對于B樹最有意思的是,索引的大小并不重要,對于任何相同大小的索引,時間將是相同的。 你也會看到這一點。

就像所有的樹(無論是在計算機科學還是在自然界中),你都以一個根開始。 計算機科學與自然的區(qū)別在于,在計算機科學中,我們把樹的根部放在頂部。

隨你。 這是3級B +樹的根音。

等級3意味著,這個節(jié)點可以有3個鍵。 這就是該節(jié)點頂部的3個盒子的用途。 下面的4個盒子保存指向另一個節(jié)點的指針或數據庫表中的一行。

現在,假設您在此節(jié)點中具有密鑰11和37,并且您沒有第三個密鑰。

然后最左邊的指針指向一個節(jié)點的鍵小于11.第二個指針指向一個節(jié)點,其鍵大于或等于11,小于37.第三個指針指向一個鍵大于或等于37的節(jié)點。

從我在開始時顯示的表格的年齡欄索引中,可以看起來像這樣。

現在的魔法就是第二行節(jié)點中的指針。 它們中的每一個指向表中具有特定鍵的單個行,在我們的示例中,這是年齡。

但不只是這個。

您會看到每個底層節(jié)點中的最后一個指針如何指向下一個節(jié)點? 這用于“索引掃描”。 我會在稍后回來。

我們來更詳細地看看第二排節(jié)點。

您現在可以看到,來自其中一個樹節(jié)點的每個指針如何指向表中的單個行。

您還可以看到來自樹節(jié)點的這些指針如何隨機地指向表中的某些行。 這就是為什么這被稱為“隨機訪問”。 數據庫隨機在數據庫表中跳轉。

隨機訪問查找

讓我們用我們之前的SQL查詢刷新我們的記憶。

SELECT * FROM people WHERE age = 19

現在索引如何幫助更快找到相應的行?

那么,讓我們看看樹:

它需要1步從第一個節(jié)點到第二個節(jié)點。 并且從第二個節(jié)點到數據庫表中的行一秒鐘。

請記住,我們必須查看所有7行以查看它們是否與數據庫查詢匹配。

而且由于19個指數中沒有更多的關鍵,我們就完成了。

索引掃描

現在,回到“索引掃描”,假設你想要計算從5歲到13歲時開始編碼的人數。

SELECT COUNT(*) FROM people WHERE age BETWEEN 5 AND 19;
SELECT COUNT(*) FROM people WHERE age >= 5 AND age <= 19;

數據庫將查找密鑰5,然后使用指向下一個節(jié)點的指針查找更多密鑰。

而且因為數據庫所需的所有查詢信息都在索引中,所以數據庫根本不會查看表。

索引非常棒

讓我們讓他們在Django。

實際上,我們已經做到了。

  • db_index = True ,您可以在模型字段上設置
  • index_together =(('name', 'age'),)你可以在模型的Meta類中設置
  • ForeignKey() / OneToOneField()使用索引快速查找相關表中的數據
  • primary_key = True ,Django自動使用AutoField表示每個模型上的id列。

這已經很棒了。 但是這個功能集有點限制。 那里不僅有B +樹索引。 還有一噸多

2016

我們來看看2016年。

馬克·坦林和我有索引的想法。 實際上,Marc在他的contrib.postgres工作中已經有了一些想法。 我們有關于API的想法。 我們希望在Django中擁有的東西。 像,讓我們讓Django支持所有的索引 。

但是我們沒有時間去實現我們的想法!

但我們很幸運。 事實上,Django項目很幸運。

Google Summer of Code 2016

Django再次被接受為Google Summer of Code的組織。 謝謝Google!

對于那些不知道這是什么的人:谷歌支付學生3個月的時間在開源項目上工作,同時由項目貢獻者進行指導。

大多數情況下, Tim Graham ,還有Marc和我輔導學生Akshesh Doshi在Django中處理更通用的索引支持。 從寫下API等提議,直到最終合并到Django中。

GSoC 2016的主要成果是django.db.models.indexes.Index(fields,name) ( docs )

它定義了所有索引的基類。 您可以通過模型的Meta類中的索引選項使用它們。

例如像這樣:

from django.db import models

class Person(models.Model):
 name = models.CharField(max_length=200)

 class Meta:
  indexes = [
   models.Index(
    fields=['name'],
    name='name_idx',
   ),
  ]

這將在數​​據庫表的名稱列上創(chuàng)建一個B +樹索引。

當然,這并不是什么新鮮事。 這就是在名稱字段中使用db_index = True時可以執(zhí)行的操作。

您當然也可以在多列上定義索引:

from django.db import models

class Person(models.Model):
 name = models.CharField(max_length=200)
 age = models.PositiveSmallIntegerField()

 class Meta:
  indexes = [
   models.Index(
    fields=['name', 'age'],
    name='name_age_idx',
   ),
  ]

當然,這也不是什么新東西。 你可以用index_together來完成。

但你現在也可以這樣做:

from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.indexes import GinIndex
from django.db import models

class Doc(models.Model):
 data = JSONField()

 class Meta:
  indexes = [
   GinIndex(
    fields=['data'],
    name='data_gin',
   ),
  ]

定義一個GinIndex 。 這是PostgreSQL特有的。 但這是你以前無法做到的事情。 至少不可靠,沒有太多的痛苦。

GinIndex可用于索引JSON blob中的鍵值。 因此,您可以篩選表中JSONB字段中的鍵映射到特定值的表中的行。 這就像“NoSQL 1-0-1”。

Django 1.11附帶的另一種內置索引類型是BrinIndex ,簡單地說,它可以允許更快地計算聚合。 比如,找出每篇文章最后一次購買的時間。

而且由于索引是數據庫模式的一部分,顯然通過遷移來追蹤索引。 因此,當您運行python manage.py migrate時會創(chuàng)建索引:

BEGIN;
--
-- Create model Doc
--
CREATE TABLE "someapp_doc" (
 "id" serial NOT NULL PRIMARY KEY,
 "data" jsonb NOT NULL);
--
-- Create index data_gin on field(s) data of model doc
--
CREATE INDEX "data_gin" ON "someapp_doc" USING gin ("data");
COMMIT;

特色創(chuàng)意

大。

這就是昨天發(fā)布的Django 1.11。

但是Django 2.0有什么用?

什么在地平線上?

我們最終想要什么?

功能索引

它們在各種情況下都很有用,在這種情況下,您不希望對原始值進行索引,但可以對其進行變化,例如字符串的小寫。 我已經在為此工作。 我還沒到。 我很想從理解表達式API的人那里獲得幫助。

from django.db import models

class Author(models.Model):
 name = models.CharField(max_length=200)

 class Meta:
  indexes = [
   FuncIndex(
    expression=Lower('name'),
    name='name_lower_idx',
   ),
  ]

db_index = <IndexClass>

如前所述,對單個列使用索引可能非常麻煩。 因此,讓我們支持Index類作為db_index的一個屬性。

from django.db import models

class Author(models.Model):
 name = models.CharField(
  max_length=200,
  db_index=HashIndex
 )

對某些領域有一個B +樹是沒有意義的。 如前所示, GinIndex對于JSONField來說非常完美。 為什么不在db_index = True時使用每個字段類的default_index_class ?

from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.indexes import GinIndex
from django.db import models

# Somewhere in Django's JSONField implementation:
# JSONField.default_index_class = GinIndex

class Document(models.Model):
 data = JSONField(db_index=True)

重構index_together和db_index

這個比面向用戶更引人注目:

我可以想象, db_index和index_together在內部使用Model._meta.indexes可能是有意義的。 這是要調查的東西。

GiSTIndex

PostgreSQL中有一個GiSTIndex ,可用于地理空間查詢,例如“給我所有與給定點最大距離為10的點”。 這不是在Django 1.11中。 我不知道為什么,但我猜是因為沒有人添加它。

請注意,Django 2.0不再支持Python 2了!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 編寫python程序的90條建議

    編寫python程序的90條建議

    自己寫 Python 也有四五年了,一直是用自己的“強迫癥”在維持自己代碼的質量。都有去看 Google 的 Python 代碼規(guī)范,對這幾年的工作經驗,做個簡單的筆記,如果你也在學 Python,準備要學習 Python,希望這篇文章對你有用。
    2021-04-04
  • python讀取與寫入csv格式文件的示例代碼

    python讀取與寫入csv格式文件的示例代碼

    本篇文章主要介紹了python讀取與寫入csv格式文件的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Python3 元組tuple入門基礎

    Python3 元組tuple入門基礎

    這篇文章主要介紹了Python3 元組tuple入門基礎,需要的朋友可以參考下
    2020-02-02
  • Python 如何測試文件是否存在

    Python 如何測試文件是否存在

    這篇文章主要介紹了Python 如何測試文件是否存在,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 用Python實現校園通知更新提醒功能

    用Python實現校園通知更新提醒功能

    今天小編就為大家分享一篇用Python實現校園通知更新提醒功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Django REST Framework序列化外鍵獲取外鍵的值方法

    Django REST Framework序列化外鍵獲取外鍵的值方法

    今天小編就為大家分享一篇Django REST Framework序列化外鍵獲取外鍵的值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python腳本使用阿里云slb對惡意攻擊進行封堵的實現

    python腳本使用阿里云slb對惡意攻擊進行封堵的實現

    這篇文章主要介紹了python腳本使用阿里云slb對惡意攻擊進行封堵的實現,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Python調用Google?Bard的圖文詳解

    Python調用Google?Bard的圖文詳解

    Google?Bard?是一種開源數據可視化和探索工具,可為?開發(fā)人員?提供支持,本文主要為大家介紹了Python調用Google?Bard的方法,需要的可以參考下
    2023-08-08
  • Python使用鄰接矩陣實現圖及Dijkstra算法問題

    Python使用鄰接矩陣實現圖及Dijkstra算法問題

    這篇文章主要介紹了Python使用鄰接矩陣實現圖及Dijkstra算法問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python?中的requirements.txt?文件的使用詳情

    python?中的requirements.txt?文件的使用詳情

    這篇文章主要介紹了python?中的requirements.txt文件的使用詳情,文章圍繞主題展開詳細內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05

最新評論

玛纳斯县| 凌海市| 榆林市| 屯昌县| 丹寨县| 靖边县| 神农架林区| 黄梅县| 石城县| 上杭县| 台北市| 施甸县| 汶川县| 新安县| 探索| 体育| 焦作市| 北票市| 个旧市| 阳朔县| 富锦市| 红原县| 临西县| 大新县| 城步| 平顶山市| 扎鲁特旗| 上林县| 伽师县| 乌兰察布市| 芷江| 新巴尔虎右旗| 宜君县| 垣曲县| 夏津县| 库伦旗| 柘荣县| 柘城县| 义马市| 青州市| 霞浦县|